0

这是我的桌子设计:

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

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

谢谢,-史蒂夫

4

2 回答 2

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
                 )

也就是说,如果请求中的 wip 的运输表中存在任何内容,则过滤掉该行。

于 2013-07-18T21:32:50.443 回答
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 的 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
  )

-> SQLfiddle展示了重要的细节。

于 2013-07-18T21:44:26.670 回答