Sql 选择所有值不在另一个表中的行

Sql 选择所有值不在另一个表中的行,sql,Sql,这是我的桌子设计: REQUEST(R_ID,attr1,attr2) WIPS(R_ID,WIP,attr3,attr4) SHIPPING(WIP,attr5,attr6) 如何限制查询以显示来自请求的信息,但仅当请求和在制品之间关联的所有在制品不在发货表中时才显示。例如,SHIPPING表包含所有已发货的WIP,我只想显示所有WIP未发货的请求行。任何帮助都将不胜感激 谢谢, -Steve您可以使用不存在的执行此操作: select * from request r where not

这是我的桌子设计:

REQUEST(R_ID,attr1,attr2)
WIPS(R_ID,WIP,attr3,attr4)
SHIPPING(WIP,attr5,attr6)
如何限制查询以显示来自
请求
的信息,但仅当
请求
在制品
之间关联的所有
在制品
不在
发货
表中时才显示。例如,
SHIPPING
表包含所有已发货的
WIP
,我只想显示所有
WIP
未发货的
请求
行。任何帮助都将不胜感激

谢谢,
-Steve

您可以使用不存在的
执行此操作:

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的发货表中存在任何内容,则过滤掉该行。

因为您正在查找请求和WIP之间关联的
WIP的行。
仅排除与
配送
的连接是不够的。首先,我们需要建立到
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
如果您的实际意思是,与
请求
关联的WIP都不能连接到
发货

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
  )