Combinați două tabele într-un singur tabel virtual cu JOIN

Observație preliminară

sintaxă

  • Versiune virgulă:
  • Cea mai simplă formă a ÎNTRĂRII INTERNE
  • Link multiplu:
  • În loc de INNER, poate fi utilizat și unul dintre următoarele cuvinte cheie:
  • OR poate fi utilizat în locul operatorului AND, pot fi specificate mai mult de două expresii de comparație și AND și OR pot fi combinate.
  • Un tabel poate fi de asemenea specificat de două ori, se vorbește despre unul Auto-legare, deoarece rândurile din tabel sunt legate de alte rânduri din tabel. În afară de versiunea virgulă, este necesar cel puțin un nume de alias pentru un tabel pentru a descrie clar coloanele.

Exemple

  1. Această versiune cu virgulă combină fiecare linie a tabelului ARTIKEL cu fiecare linie a tabelului VÂNZĂRI și generează rezultatul a 4 * 9 = 36 de linii în întregime. Dacă comparați cele două coloane A.A_NR și U.A_NR, se observă că vânzările sunt, în majoritatea cazurilor, articole alocate care sunt diferite de articolul menționat în vânzări. Aceste rezultate (36 - 9) = 27 nu au sens. Condiția de filtrare specificată în clauza ON din următoarea clauză JOIN elimină aceste înregistrări de date.
  2. Aceasta este cea mai simplă și cea mai frecvent utilizată formă de JOIN. Coloana A. A_NR este, de asemenea, cheia principală a tabelului ARTIKEL; pot exista mai multe comenzi pentru un articol, adică rânduri în tabelul VÂNZĂRI. Toate liniile în care cele două coloane A.A_NR și U.A_NR nu se potrivesc sunt eliminate din versiunea cu virgulă menționată mai sus.

Această interogare se potrivește mai întâi cu toate acele linii între ele care se referă la aceeași dată și la același articol. Deoarece a treia condiție este să verificați dacă coloana A_STUECK este diferită, toate combinațiile de dată și articol care se referă la același rând sunt mai întâi eliminate. Totuși, același lucru ar îndeplini testul U1.UMSATZ_NR <> U1.UMSATZ_NR. Testul utilizat efectiv elimină, de asemenea, toate combinațiile de dată și articol pentru care articolul a fost vândut de mai multe ori cu același număr de piese; se produc doar acele combinații în care articolul a fost vândut în cel puțin două numere diferite de piese într-o singură zi. Deoarece fiecare combinație de linii care îndeplinește aceste condiții este îndeplinită și dacă cele două linii sunt schimbate, condiția <> poate fi înlocuită și cu U2.Versatz_Nr, deci numai articolul 11 ​​este emis pe 25.06.1999, care a fost vândut de două ori de douăzeci de ori. În întregime:

într-un

Observații

  1. Dacă legați tabele, ar trebui să utilizați de obicei una dintre metodele JOIN. În special, ar trebui evitată tehnica „veche”, care folosește versiunea între paranteze și mută clauza ON în condiția WHERE. Comparați următoarele două reprezentări: cu În prima versiune, care nu poate fi utilizată, condiția pentru legarea celor două tabele este amestecată cu condiția care selectează câteva rânduri. A doua versiune, cu toate acestea, separă legarea tabelelor de reducerea coloanelor. De regulă, toate condițiile WHERE care reduc numărul de linii sunt executate mai întâi; JOIN este creat numai folosind numărul rămas de linii.
  2. Unirea STÂNGA și DREAPTA este simetrică una cu cealaltă. Următoarele două declarații pentru determinarea articolelor vândute niciodată ar trebui, prin urmare, să genereze aceeași diagramă de flux (adăugați un articol vândut niciodată ca mai sus): și OUTER JOIN combină STÂNGA/DREAPTA și acceptă atât rândurile potrivite, cât și valorile nule din ambele tabele.
  3. Construcțiile de îmbinare la stânga sau la dreapta sunt obligatorii dacă un tabel conține un link către un tabel de margini opțional. Un exemplu clasic atribuie titluri persoanelor, titlurile (Dr., Dr.med, Prof. Dr.) sunt stocate într-un tabel de margini, tabelul de persoane conține o coloană cu ID-ul tabelului de titlu. Dacă există persoane fără titlu, fie o intrare fără text poate fi creată în tabelul de marjă și o INNER JOIN poate fi utilizată pentru legare sau o astfel de intrare lipsește. Aceasta înseamnă că celula corespunzătoare din tabelul de persoane este goală, astfel încât trebuie să se formeze o îmbinare stânga/dreapta de la tabela principală la tabelul de margine dacă se găsesc toate persoanele.

Un exemplu pentru MS-SqlServer: CoalEsce returnează prima expresie din listă care este diferită de zero. Dacă există un titlu, acesta este afișat cu un spațiu ca separator, altfel un șir gol este adăugat la ieșirea anterioară constând din nume, virgulă și prenume.