YTRE FØLGENDE erklæring

Tilgjengelig

Årsaker til YTRE JOIN

Husker du forresten da vi slo sammen regnearkene våre og kontorrengjøringsoppgavene våre forsvant fordi det ikke fantes noen renere ennå?

Hvis du kjører et søk som dette:

SELECT * FROM task

Da får vi dette resultatet:

id emploee_id Navn frist
1 1 Rett opp en feil på frontend 2022-06-01
2 2 Rett opp en feil på backend 2022-06-15
3 5 Kjøp kaffe 2022-07-01
4 5 Kjøp kaffe 2022-08-01
5 5 Skal kjøpe kaffe 2022-09-01
6 (NULL) Rydd opp på kontoret (NULL)
7 4 Nyt livet (NULL)
8 6 Nyt livet (NULL)

"Tøm kontor"-oppgaven forsvinner hvis vi prøver å slå sammen oppgavetabellen med ansatttabellen etter ansatt_id.

For å løse dette problemet er det lagt til ulike modifikatorer i JOIN-operatoren som gjør at slike foreldreløse rader kan lagres uten et par i en annen tabell.

La meg minne deg om den klassiske formen for JOIN-operatøren:

table 1 JOIN table 2 ON
condition

Vi kan fortelle SQL Server å sørge for at alle data fra den venstre tabellen (tabell1) er tilstede i den sammenføyde tabellen. Selv om det ikke er noen par for dem i riktig tabell. For å gjøre dette trenger du bare å skrive:

table 1 LEFT JOIN table 2 ON condition

Hvis du vil at den sammenføyde tabellen skal ha alle radene fra den høyre tabellen , må du skrive:

table 1 RIGHT JOIN table 2 ON
 condition

La oss skrive en spørring som vil kombinere alle oppgaver og ansatte slik at oppgaver uten utførende ikke går tapt. For å gjøre dette, skriv en spørring:

SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id

Og resultatet av denne spørringen:

id Navn okkupasjon lønn alder join_date id emploee_id Navn
1 Ivanov Ivan Programmerer 100 000 25 2012-06-30 1 1 Rett opp en feil på frontend
2 Petrov Petr Programmerer 80 000 23 2013-08-12 2 2 Rett opp en feil på backend
4 Rabinovich Moisha Regissør 200 000 35 2015-05-12 7 4 Nyt livet
5 Kirienko Anastasia Kontorsjef 40 000 25 2015-10-10 3 5 Kjøp kaffe
5 Kirienko Anastasia Kontorsjef 40 000 25 2015-10-10 4 5 Kjøp kaffe
5 Kirienko Anastasia Kontorsjef 40 000 25 2015-10-10 5 5 Kjøp kaffe
6 Vaska katt 1000 3 2018-11-11 8 6 Nyt livet
(NULL) (NULL) (NULL) (NULL) (NULL) (NULL) 6 (NULL) Rydd opp på kontoret

En annen rad er lagt til tabellen vår, og interessant nok er det mange NULL-verdier i den. Alle data som ble hentet fra ansatttabellen vises som NULL, siden det ikke var noen eksekutør fra ansatttabellen for oppgaven "Rent kontor".

JOIN-typer

Det er 4 typer JOINs totalt. De er presentert i tabellen nedenfor:

Kort oppføring lang inngang Forklaring
1 BLI MED INDRE BLI MED Bare poster som er i tabell A og B
2 VENSTRE BLI MED VENSTRE YTRE JOIN Alle rader uten et par fra tabell A må være
3 HØYRE BLI MED HØYRE YTRE SKJØT Alle rader uten et par fra tabell B må være
4 YTRE SKJØT FULL YTTRE FØLGING Alle rader med basepar fra tabell A og B skal være

For enkelhets skyld, hvis vi representerer tabeller som sett, kan JOIN vises som et bilde:

Sett skjæringspunkt betyr at for en tabell er det en tilsvarende post fra en annen tabell som den refererer til.

Spørsmål fra intervjuet

Noen ganger blir nybegynnere programmerere bombardert med et veldig enkelt spørsmål under et intervju. Gitt våre tabeller kan den formuleres som følger:

"Skriv en spørring som viser en liste over alle ansatte som det ikke er noen oppgaver for ." Først, la oss prøve å omformulere dette spørsmålet litt: "Skriv en spørring som vil vise en liste over alle ansatte fra ansatttabellen som det ikke er noen oppgaver for i oppgavetabellen ." Vi må få dette settet:

Det er mange måter å løse dette problemet på, men jeg starter med den enkleste: Først kan du slå sammen tabellene våre med en LEFT JOIN, og deretter bruke WHERE for å ekskludere alle rader der de manglende dataene ble polstret med NULL.

SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

Og resultatet av denne spørringen:

id Navn okkupasjon lønn alder join_date id emploee_id Navn
3 Ivanov Sergey Tester 40 000 tretti 2014-01-01 (NULL) (NULL) (NULL)

Den eneste ulempen med denne løsningen er at her inneholder radene i tabellen NULL, og etter betingelse må vi vise en liste over ansatte.

For å gjøre dette, må du enten liste de nødvendige kolonnene i ansatttabellen i SELECT, eller hvis du trenger å vise dem alle, kan du skrive følgende konstruksjon:

SELECT e.* FROM employee e, task t 

Den fullstendige forespørselen vil se slik ut:

SELECT e.*  
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

resultatet av denne spørringen:

id Navn okkupasjon lønn alder join_date
3 Ivanov Sergey Tester 40 000 tretti 2014-01-01

Resten av metodene er overlatt til deg for lekser. Jeg vil ikke frata deg gleden av å finne dem selv.

Kommentarer
  • Populær
  • Ny
  • Gammel
Du må være pålogget for å legge igjen en kommentar
Denne siden har ingen kommentarer ennå