这是我的桌子设计:
REQUEST(R_ID,attr1,attr2)
WIPS(R_ID,WIP,attr3,attr4)
SHIPPING(WIP,attr5,attr6)
我如何限制我的查询以显示信息,REQUEST
但仅显示所有wips
关联之间REQUEST
和WIPS
不在SHIPPING
表中的信息。例如,SHIPPING
表中有所有WIPS
已发货的,我只想显示所有未发货的REQUEST
行WIPS
。任何帮助将不胜感激。
谢谢,-史蒂夫
这是我的桌子设计:
REQUEST(R_ID,attr1,attr2)
WIPS(R_ID,WIP,attr3,attr4)
SHIPPING(WIP,attr5,attr6)
我如何限制我的查询以显示信息,REQUEST
但仅显示所有wips
关联之间REQUEST
和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
)
也就是说,如果请求中的 wip 的运输表中存在任何内容,则过滤掉该行。
由于您正在寻找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 的 USING 子句,请改用:
LEFT JOIN shipping s ON s.wip = w1.wip
如果您的意思是,与 a 关联的所有 wiprequest
都不能连接到 a 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
)