2013-07-18 68 views
0

這是我的表設計:選擇行,其中另一個表中的所有值不

REQUEST(R_ID,attr1,attr2) 
WIPS(R_ID,WIP,attr3,attr4) 
SHIPPING(WIP,attr5,attr6) 

如何限制我的查詢,以顯示從REQUEST信息,但只有在所有REQUESTWIPS之間相關聯的wips的不在SHIPPING表中。例如,SHIPPING表具有已發貨的所有WIPS,我只想顯示REQUEST行,其中所有WIPS尚未發貨。任何幫助將不勝感激。

感謝, 史蒂夫

回答

1

你可以用not exists做到這一點:

select * 
from request r 
where not exists (select 1 
        from wips w join 
         shipping s 
         on w.wip = s.wip 
        where w.r_id = r.r_id 
       ) 

也就是說,如果在對請求的WIPS航運表存在什麼,然後過濾掉的行。

0

既然您正在尋找行wips associated between REQUEST and WIPS 這是不足以排除連接到shipping。我們需要建立wip連接入手:

SELECT * 
FROM request r 
WHERE EXISTS (
    SELECT 1 
    FROM wips w1 
    LEFT JOIN shipping s USING (wip) 
    WHERE w1.r_id = r.r_id 
    AND s.wip IS NULL 
) 

如果您的RDBMS不具備JOIN的使用條款,使用,而不是:

LEFT JOIN shipping s ON s.wip = w1.wip 

如果你真正的意思是,沒有的與request相關聯的WIPS可以連接到一個shipping

SELECT * 
FROM request r 
WHERE NOT EXISTS (
    SELECT 1 
    FROM wips w1 
    JOIN shipping s USING (wip) 
    WHERE w1.r_id = r.r_id 
) 
-- but has to have at least one wip connected? 
AND EXISTS (
    SELECT 1 
    FROM wips w1 
    WHERE w1.r_id = r.r_id 
) 

->SQLfiddle demonstrating important details.

相關問題