Dues taules: JOIN explícit

Índex

 

JOIN explícit

En el JOIN explícit es dona una clara diferenciació entre les condicions relacionals entre les dues taules i els requisists interiors d'una taula, i per a això fa servir comandaments diferents:

En resum,

FROM "taula_A"
JOIN "taula_B"
ON "taula_A"."camp_x" = "taula_B"."camp_y"
WHERE alguna condició interna

Insistirem en les taules "Departaments" i "Personal", ja vistes i que repetim aquí:

#

#

 

JOIN ... ON ... sense WHERE

Amb JOIN ... ON ... i sense WHERE aconseguim presentar la integritat de les dues taules relacionades (a condició que siguin completes).

Volem establir, per exemple, la llista completa de tot el personal, classificat per departaments:

SELECT "Departaments"."Departament", "Personal"."Nom", "Personal"."Cognoms"
FROM "Personal"
JOIN "Departaments" ON "Personal"."IdD" = "Departaments"."IdD"
ORDER BY "Departaments"."Departament"

amb el següent resultat:

captura

(Notem que hi ha ha mancances; de moment les ignorem i més endavant hi tornarem.)

 

JOIN ... ON ... + WHERE

Una consulta amb JOIN explícit es pot restringir més afegint-hi una clàusula WHERE, que, com el el cas de les consultes simples, es refereix als valors interns dels camps.

Com a mostra, repetim l'exemple precedent afegint-hi, però, un WHERE per a prescindir del departament “Oficina”:

SELECT "Cognoms", "Departaments"."Departament"
FROM "Personal"
JOIN "Departaments" ON "Personal"."IdD" = "Departaments"."IdD"
WHERE "Departaments"."Departament" <> 'Oficina'
ORDER BY "Departament", "Cognoms"

Notem els usos ben diferenciats que tenen ON i WHERE: ON compara els valors de dos camps de dues taules; WHERE cerca un valor determinat en un camp d'una taula.

El resultat és el següent

captura

 

Consultes sobre taules amb una relació 1:1

Una relació 1:1 representa en realitat la fragmentació d'una única taula lògica.

Aquesta fragmentació pot obeir a diverses causes:

Suposem la llista de treballadors d'una empresa, ja vista (al capdamunt d'aquesta pàgina). Hi afegirem una altra taula - diguem-ne "Documents" -, on recollirem dades tals com el document d'identitat i el número de la Seguretat Social. Aquesta nova taula tindrà una clau primària pròpia del mateix tipus que la de l'altra taula (això garanteix que no hi entrarem duplicats) però no autonumèrica (això ens permet entrar els valors dels camps en l'ordre que volguem).

En crear la relació entre les dues taules, apareix la indicació 1:1.

Suposem que el contingut d'aquesta nova taula és el següent:

captura

Podem fer una consulta conjunta sobre les dues taules; per exemple

SELECT *
FROM "Personal" JOIN "Documents" ON "Personal"."IdP" = "Documents"."IdP"
ORDER BY "Cognoms"

El resultat serà següent:

captura

 

Taules autoreferenciades

En alguns casos és útil de dissenyar una taula en què un dels atributs de cada registre sigui una referència a un altre registre de la mateixa taula. Per exemple, una taula "Treballadors" en què cada 'treballador' és assignat a un 'cap', però en cap moment no s'estableixen nivells: simplement habilitem una columna 'Cap' en què el cap de cadascú és identificat per la referència 'Id'. Els membres del nivell superior s'autoreferencien.

#

En aquest cas fem una doble consulta sobre una taula. Mitjançant sengles àlies simulem dues còpies de la taula; en diem "A" i "B".

La fórmula de recerca és la següent:

SELECT "A"."Nom", "A"."Cognoms", "B"."Nom" || ' ' || "B"."Cognoms" AS "Cap"
FROM "Treballadors" "A"
INNER JOIN "Treballadors" "B" ON "B"."Id" = "A"."Cap"
ORDER BY "A"."Cognoms"

I aquest és el resultat:

#