SQL Self-Join

Sql Self Join



Una dintre cele mai renumite caracteristici ale bazelor de date relaționale este alăturarea. Joinurile sunt una dintre cele mai puternice și complexe caracteristici ale bazelor de date relaționale. Acestea permit o modularitate extinsă și relații foarte complexe între tabelele bazei de date, fără a compromite performanța.

Cu toate acestea, există un tip de alăturare în SQL care tinde să treacă sub radar și care este cunoscut sub numele de auto-unire.

În SQL, un self-join este o tehnică puternică care ne permite să combinăm rândurile din același tabel pe baza unei coloane înrudite din același tabel.







Spre deosebire de celălalt tip de alăturare în SQL, unde luăm datele din mai multe tabele, o auto-unire funcționează pe un singur tabel.



S-ar putea să vă întrebați, de ce am nevoie de o auto-unire când pot căuta datele din tabel în sine? Deși acest lucru poate fi adevărat, o auto-aderare poate ajuta în sarcini atunci când trebuie să efectuați interogări recursive de date sau să găsiți date ierarhice.



În esență, o auto-alăturare joacă un rol fundamental în care trebuie să comparați rândurile aceluiași tabel.





Alăturați-vă nouă în această postare în timp ce explorăm ce sunt auto-asocierile, cum funcționează și cum le putem folosi într-un tabel SQL.

NOTĂ: Înainte de a ne scufunda, vom configura un tabel de bază în scopuri demonstrative. Cu toate acestea, simțiți că utilizați orice set de date acceptat.



Eșantion de date

Următoarele interogări creează un tabel de bază care conține informații despre produs și inserează probele de înregistrări în tabel. Acest lucru ne permite să demonstrăm cum să lucrăm cu auto-uniuni în SQL.

CREATE TABLE Produse (
product_id INT PRIMARY KEY,
product_name VARCHAR(255) NOT NULL,
parent_id INT
);

Adăugați 10 probe de înregistrări în tabel.

INSERT INTO Products (product_id, product_name, parent_id) VALUES
(1, „Electronics”, NULL),
(2, „Telefoane inteligente”, 1),
(3, „Laptop-uri”, 1),
(4, „iPhone 13”, 2),
(5, „Samsung Galaxy S21”, 2),
(6, „MacBook Pro”, 3),
(7, „Dell XPS 15”, 3),
(8, „Accesorii”, NULL),
(9, „Huse pentru telefon”, 8),
(10, „Galgi pentru laptop”, 8);

Tabelul rezultat este următorul:

Exemplul 1: Auto-aderarea de bază

Să începem cu o auto-unire de bază. De exemplu, putem folosi o simplă auto-unire pentru a prelua relația părinte-copil din același tabel.

De exemplu, îl putem folosi pentru a găsi toate produsele și produsele părinte corespunzătoare. Putem rula o interogare după cum urmează:

SELECTAȚI c.nume_produs ca produs_copil, p.nume_produs AS produs_părinte
DIN Produse c
LEFT JOIN Produse p ON c.parent_id = p.product_id;

În exemplul de interogare dat, folosim „c” ca alias pentru tabelul de produse care reprezintă produsele secundare.

De asemenea, creăm alias-ul „p” pentru tabelul de produse pentru a reprezenta produsele părinte.

În pasul următor, folosim un SQL LEFT JOIN de bază pentru a ne asigura că produsele de nivel superior sunt incluse în rezultat.

În cele din urmă, folosim clauza ON pentru a crea o relație între înregistrările copil și părinte folosind coloanele „parent_id” și „product_id”.

Tabelul rezultat este următorul:

Veți observa că produsele părinte nu au o legătură de sus, deoarece se află în partea de sus a ierarhiei, care sunt cunoscute și ca elemente rădăcină.

Exemplul 2: Preluați date ierarhice

Unul dintre cele mai fundamentale roluri ale unei auto-aderări este preluarea datelor ierarhice. De exemplu, să presupunem că vrem să recuperăm toate produsele copil în care produsul este egal cu „Accesorii”. Putem rula interogarea folosind o auto-unire, după cum urmează:

SELECTează c.nume_produs AS child_product
DIN Produse c
JOIN Products p ON c.parent_id = p.product_id
WHERE p.product_name = 'Accesorii';

În acest caz, folosim un JOIN pentru a combina tabelul de produse cu el însuși și apoi folosim clauza WHERE pentru a filtra rezultatele pe care le dorim.

Concluzie

În acest tutorial, am explorat ce este o auto-unire, cum funcționează și cum o putem folosi în tabelul SQL pentru a prelua date ierarhice sau pentru a efectua interogări recursive.