sql >> Databáze >  >> RDS >> Mysql

SQL - Levé spojení 2 cizích klíčů s 1 primárním klíčem

Často vidím, že lidé bojují s myšlenkou připojit tabulku k sobě nebo vícekrát ve stejném dotazu (jak tomu bylo zde). Po zvládnutí je to skvělá technika pro použití na stolech, které mají mnoho vztahů mezi řadami (například seznam týmů, které musí hrát mezi sebou!). Jak již zdůraznili ostatní, musíte použít dva inner join jak toho dosáhnout:

select
    *
from
    games g
    inner join teams t1 on
        g.teamid1 = t1.teamid
    inner join teams t2 on
        g.teamid2 = t2.teamid

Pokud tedy vaše games tabulka vypadá takto:

GameID    TeamID1    TeamID2
----------------------------
     1          1          3
     2          4          2
     3          2          1

Získáte sadu výsledků:

g.GameID    g.TeamID1    g.TeamID2    t1.TeamID    t1.Name    t2.TeamID    t2.Name
----------------------------------------------------------------------------------
       1            1            3            1    Lions              3    Bears
       2            4            2            4    Oh My              2    Tigers
       3            2            1            2    Tigers             1    Lions

Samozřejmě bych tyto sloupce aliasoval v select prohlášení, kdybych byl já, kvůli použitelnosti:

select
    g.GameID,
    t1.Name as Team1,
    t2.Name as Team2
from
    ...

Tímto způsobem mohou být sloupce pojmenovány vhodně, namísto toho, aby měly t1 a t2 sloupce mají stejné názvy.

Nyní k vyřešení nejasností ohledně left join je. Vidíte, left join vezme všechny řádky z první (nebo levé) tabulky a poté porovná všechny řádky na podmínce spojení s druhou (nebo pravou) tabulkou. Pro všechny řádky z levé tabulky získáte null ve všech sloupcích right tabulka.

Když se ponoříme do příkladu, řekněme, že někdo vložil null pro TeamID2 na jednom z řádků z jakéhokoli důvodu. Řekněme také, že tým TeamID 4 dříve existoval, ale již neexistuje.

GameID    TeamID1    TeamID2
----------------------------
     1          1          3
     2          4          2
     3          1       null

Nyní se podívejme na to, jaké left join by bylo z hlediska dotazu:

select
    *
from
    games g
    left join teams t1 on
        g.teamid1 = t1.teamid
    left join teams t2 on
        g.teamid2 = t2.teamid

Logicky to zabere všechny naše games a poté je přiřaďte k příslušným teams . Pokud však TeamID neexistuje, dostaneme null s. Bude to vypadat takto:

g.GameID    g.TeamID1    g.TeamID2    t1.TeamID    t1.Name    t2.TeamID    t2.Name
----------------------------------------------------------------------------------
       1            1            3            1    Lions              3    Bears
       2            4            2         null    null               2    Tigers
       3            1         null            1    Lions           null    null

Proto left join bude pouze je nutné, pokud je tým volitelný.

Ve vašem případě budete používat inner join připojit se ke stolu vícekrát. Toto je velmi běžná praxe a je docela užitečná. Vyhne se některým úskalím poddotazů (zejména na MySQL) a zároveň vám umožní získat data z tabulky pro intratable porovnání. To je velmi užitečné, když se snažíte najít pořadí něčeho nebo související řádky.

Každopádně doufám, že tato velmi nesourodá odpověď někde někomu pomůže.



  1. Dotaz MySQL pro více tabulek, které jsou sekundárními tabulkami s více položkami?

  2. Pomocí sp_help_jobschedule v SQL Server

  3. Jak mohu najít číslo portu serveru SQL z registru systému Windows?

  4. ORA-29977:Nepodporovaný typ sloupce pro registraci dotazu v zaručeném režimu