选择行,其中另一个表中的所有值不
问题描述:
这是我的表设计:选择行,其中另一个表中的所有值不
REQUEST(R_ID,attr1,attr2)
WIPS(R_ID,WIP,attr3,attr4)
SHIPPING(WIP,attr5,attr6)
如何限制我的查询,以显示从REQUEST
信息,但只有在所有REQUEST
和WIPS
之间相关联的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
)