Sql 数一数只有两行的地方

Sql 数一数只有两行的地方,sql,join,count,Sql,Join,Count,这是给我的所有采购订单,它们的任务类型都是D和M 但我如何才能得到它,使它只显示只有一个D和一个M的采购订单,而没有更多 我是个新手,花了我大半天的时间才弄明白上面的问题。所以我现在真的被难住了。我希望你不需要更多的背景 您可以尝试以下修改的查询,该查询在中使用: select DISTINCT po. * from purchaseorder po inner join poTask pt on (po.purchaseorderid = pt.purchaseorderid) inner j

这是给我的所有采购订单,它们的
任务类型都是D和M

但我如何才能得到它,使它只显示只有一个D和一个M的采购订单,而没有更多


我是个新手,花了我大半天的时间才弄明白上面的问题。所以我现在真的被难住了。我希望你不需要更多的背景

您可以尝试以下修改的查询,该查询在中使用:

select DISTINCT po. *
from purchaseorder po
inner join poTask pt on (po.purchaseorderid = pt.purchaseorderid)
inner join poTaskline ptl1 on (pt.potaskid = ptl1.potaskid) and ptl1.poTasklinetype = 'M'
inner join poTaskline ptl2 on (pt.potaskid = ptl2.potaskid) and ptl2.poTasklinetype = 'D'
where po.PoStatus = 6
我将使用
(NOT)EXISTS
检查
poTaskline
表中是否存在这些条目:

select DISTINCT po. *
from purchaseorder po
inner join poTask pt on (po.purchaseorderid = pt.purchaseorderid)
inner join poTaskline ptl1 on (pt.potaskid = ptl1.potaskid) and ptl1.poTasklinetype in ('M', 'D')
where po.PoStatus = 6

您可以使用
HAVING
子句筛选您的组

SELECT po.*
FROM purchaseorder po
INNER JOIN poTask pt ON po.purchaseorderid = pt.purchaseorderid
WHERE po.PoStatus = 6 -- PoStatus of 6
AND EXISTS (SELECT 1 FROM poTaskLine ptl WHERE ptl.potaskid = pt.potaskid AND ptl.poTasklinetype = 'M') -- there's a poTaskLine entry for 'M' for this potaskid
AND EXISTS (SELECT 1 FROM poTaskLine ptl WHERE ptl.potaskid = pt.potaskid AND ptl.poTasklinetype = 'D') -- there's a poTaskLine entry for 'D' for this potaskid
AND NOT EXISTS (SELECT 1 FROM poTaskLine ptl WHERE ptl.potaskid = pt.potaskid AND ptl.poTasklinetype NOT IN ('D', 'M')) -- there aren't any poTaskLine entries for anything else

使用
groupby
并比较
having
子句中的值。下面将获取所有任务信息。它根据采购订单id进行聚合:

select po. *
from purchaseorder po
inner join poTask pt
  on po.purchaseorderid = pt.purchaseorderid
inner join poTaskline ptl1
  on pt.potaskid = ptl1.potaskid
    and 
      (ptl1.poTasklinetype = 'M'
       OR ptl1.poTasklinetype = 'D')
where po.PoStatus = 6
GROUP BY po.col1, po.col2... -- You must mention here all necessary fields from
                             -- purchaseorder which must be in select list
HAVING COUNT(po.id) = 2

最后,
having
子句统计行类型既不是
D
也不是
M
的次数。
=0
表示没有这样的类型。

这将给出
有一个'D'或'M'
,它不需要两者,它不强制执行
,也没有更多的
。强制执行
没有任何不是'D'或'M'的东西,但没有强制执行
有一个'D'和'M'
。有趣的语法。哪种RDBMS支持这一点?+1:然而,注意,对于三个这样的相关子查询,通过使用
模式,这可能比
组慢。
select po.*
from purchaseorder po inner join
     poTask pt
     on (po.purchaseorderid = pt.purchaseorderid) inner join
     poTaskline ptl
     on (pt.potaskid = ptl.potaskid
where po.PoStatus = 6
group by po.purchaseorderid
having sum( ptl.poTasklinetype not in ('D', 'M')) = 0;