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

Podmínka INNER JOIN v klauzuli WHERE nebo ON?

Pro vnitřní spojení, jako je tento, jsou logicky ekvivalentní. Můžete se však dostat do situací, kdy podmínka v klauzuli spojení znamená něco jiného než podmínka v klauzuli where.

Pro jednoduchou ilustraci si představte, že uděláte levý spoj takto;

select x.id
from x
       left join y
         on x.id = y.id
;

Zde bereme všechny řádky z x, bez ohledu na to, zda existuje odpovídající id v y. Nyní řekněme, že naše podmínka pro připojení roste – nehledáme pouze shody v y na základě id, ale také podle id_type.

select x.id
from x
       left join y
         on x.id = y.id
         and y.id_type = 'some type'
;

Opět to dává všechny řádky v x bez ohledu na to, zda existuje shoda (id, id_type) v y.

Toto je však velmi odlišné:

select x.id
from x
       left join y
         on x.id = y.id
where y.id_type = 'some type'
;

V této situaci vybíráme všechny řádky x a snažíme se přiřadit řádky od y. Nyní pro řádky, pro které neexistuje shoda v y, bude y.id_type null. Z tohoto důvodu není splněno y.id_type ='nějaký typ', takže ty řádky, kde není shoda, jsou zahozeny, což fakticky změnilo toto na vnitřní spojení.

Stručně řečeno:u vnitřních spojení nezáleží na tom, kde jsou podmínky, ale u vnějších může.



  1. Je v Apache Spark 2.0.0 možné načíst dotaz z externí databáze (spíše než uchopit celou tabulku)?

  2. Tisk tabulky vodorovně namísto svislé pomocí PHP

  3. VYBERTE * KDE NEEXISTUJE

  4. SQL vnořené pořadí podle?