2013-07-28 11 views
12

Mam dwie tabele: pq i pe. Próbuję ustawić LEFT OUTER JOIN lewy stolik (pq) na prawym stole (pe).MySQL pozostawił sprzężenie zewnętrzne z klauzulą ​​where - zwracanie niedopasowanych wierszy

  • pq ma podstawową kolumnę klucza id
  • PE ma dwukolumnowy klucz podstawowy, więc może mieć wiele pqid lub żaden
  • pe .uid kolumna musi być stosowana wyodrębnić tylko istotne dane (WHERE pe.uid = "12345")
  • pe . Data należy dołączyć do każdego pq .id rząd

Oto jak wyglądają tabele:

pq: 
id | data 
1 | "abc" 
2 | "efg" 

pe: 
pqid | uid | data 
2 | 54321 | "uvw" 
2 | 12345 | "xyz" 

mogę użyć następującej kwerendy, aby dopasować pierwsze 2 rzędy pq .id do RLM .pqid

SELECT pq.id, pq.data, pe.data FROM pq 
    LEFT OUTER JOIN pe ON pq.id = pe.pqid 
    ORDER BY pq.id LIMIT 2 

Otrzymuję:

pq.id | pq.data | pe.data 
1  | "abc" | 
2  | "efg" | "uvw" 

Ale jeśli mogę użyć WHERE tak:

SELECT pq.id, pq.data, pe.data FROM pq 
    LEFT OUTER JOIN pe ON pq.id = pe.pqid 
    WHERE pe.uid='12345' 
    ORDER BY pq.id LIMIT 2 

dostaję tylko jeden wiersz z pasującymi pe .pqid I pe .uid:

pq.id | pq.data | pe.data 
2  | "efg" | "xyz" 

Więc z WHERE klauzula Mam prawo pe .data, ale nie dostaję pq wierszy, które nie mają pq .ID dopasowanie RLM .pqid

Muszę dostać to:

pq.id | pq.data | pe.data 
1  | "abc" | 
2  | "efg" | "xyz" 

Odpowiedz

30

Tak. Klauzula where obraca lewe połączenie zewnętrzne w połączenie wewnętrzne.

Dlaczego? Wartość pe.pqid to NULL (podobnie jak pe.uid), gdy nie ma dopasowania. Tak więc porównanie w klauzuli where kończy się niepowodzeniem (prawie wszystkie porównania z NULL zwracają NULL, co jest uważane za fałszywe).

Rozwiązaniem jest przeniesienie porównania do klauzuli on:

SELECT pq.id, pq.data, pe.data 
FROM pq LEFT OUTER JOIN 
    pe 
    ON pq.id = pe.pqid and 
     pe.uid='12345' 
ORDER BY pq.id LIMIT 2 
Powiązane problemy