选择行,其中另一个表中的所有值不

问题描述:

这是我的表设计:选择行,其中另一个表中的所有值不

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

如何限制我的查询,以显示从REQUEST信息,但只有在所有REQUESTWIPS之间相关联的wips的不在SHIPPING表中。例如,SHIPPING表具有已发货的所有WIPS,我只想显示REQUEST行,其中所有WIPS尚未发货。任何帮助将不胜感激。

感谢, 史蒂夫

你可以用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航运表存在什么,然后过滤掉的行。

既然您正在寻找行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.