2014-07-18 7 views
5

LEFT JOINS를 사용하여 고아가 된 menu_item 레코드를 찾은 다음 NULL 값을 확인하려고합니다.LEFT JOIN을 사용하여 MySQL에서 분리 된 레코드 찾기

아래의 쿼리는 실제로 고아가 아닌 결과를 반환합니다. mitem_id는 menu_item 테이블의 기본 키이고 price_info 테이블의 외래 키입니다. pinfo_id는 price_info 테이블의 기본 키이고 외래 키 orderdetails 테이블입니다. 기록의

SELECT DISTINCT mi.mitem_id, descr 
FROM menu_item mi 
    LEFT JOIN price_info pi ON pi.menu_item = mi.mitem_id 
    LEFT JOIN orderdetails od ON od.price_info = pi.pinfo_id 
WHERE od.detail_id IS NULL; 

하나는이 같은 모습을 반환 : 나는 고아하지 알고 어떻게

+----------+------------------+ 
| mitem_id | descr   | 
+----------+------------------+ 
|  926 | Alameda Pale Ale | 
+----------+------------------+ 

나는 쿼리를 실행할 때 때문이다

SELECT od.detail_id 
FROM orderdetails od 
    INNER JOIN price_info pi ON pi.pinfo_id = od.price_info 
    INNER JOIN menu_item mi ON mi.mitem_id = pi.menu_item 
WHERE mi.mitem_id = 926; 

그것은의 집합을 반환 기록 :

+-----------+ 
| detail_id | 
+-----------+ 
| 142830 | 
| 142876 | 
| 143394 | 
| 143610 | 

왜 고아가 아닌 결과를 돌려 주는가?

+0

LEFT JOIN은 "왼쪽"테이블에있는 모든 항목을 반환하며, "오른쪽"테이블에있을 수도 있고 그렇지 않을 수도 있습니다. "왼쪽"테이블에 있기 때문에 여전히 "오른쪽"테이블에있는 레코드를 반환합니다. –

+0

OUTER JOIN을 사용하는 경우 JOINS 시퀀스가 ​​결과와 관련이 있습니다. 귀하의 질문은 매우 다릅니다. 다른 테이블에 대해 최소한의 샘플 데이터를 추가해야합니다. – VMai

+2

detaildid가 NULL 인 orderdetails에서 하나 이상의 행이 조인 될 수 있습니까? 즉, menu_item 및 price_info와 일치하는 orderdetails의 행이 여러 개있을 수 있으며 적어도 하나는 NULL이 아닙니다. – kane

답변

1

Kane은 null이 아니었던 레코드가 반환된다는 점에서 정확했습니다. menu_item과 price_info의 다 대다 관계 때문에 LEFT JOIN WHERE NULL을 사용하여 고아 레코드를 찾지 못했습니다. 나는 내 쿼리를 다음과 같이 변경해야만했다.

SELECT DISTINCT mi.mitem_id, descr FROM menu_item mi 
WHERE mi.mitem_id NOT IN 
(SELECT mi.mitem_id FROM menu_item mi 
INNER JOIN price_info pi ON pi.menu_item = mi.mitem_id 
INNER JOIN orderdetails od ON od.price_info = pi.pinfo_id)