根据1:N相关表中两个不同行的存在,查找表中的行

时间:2014-09-16 19:19:49

标签: sql sql-server

假设我有一个表客户端,具有字段ClientID,并且该客户端具有在另一个表Orders中加载的订单,其中外键ClientID用于链接两者。

客户可以有多个订单(1:N),但订单有不同的类型,由TypeID字段描述。

现在,我想选择包含多种类型订单的客户端。例如,具有类型1和2的订单的客户(两者,不是一个或另一个)。

如何构建此查询?我真的迷失在这里。

编辑:假设我在SQL Server上。

3 个答案:

答案 0 :(得分:1)

这是一个解决方案:

select * from clients c
 where exists (select 1 from orders o where typeid = 1 and o.clientid = c.clientid)
   and exists (select 1 from orders o where typeid = 2 and o.clientid = c.clientid)
   and exists (select 1 from orders o where typeid = 3 and o.clientid = c.clientid)
   -- additional types ...

答案 1 :(得分:1)

您可以使用INTERSECT来表示结果集的交集。

答案 2 :(得分:1)

这是在假设TypeId可以是1或2的情况下查询。这将返回同时具有Type1和Type2的ClientId,无论它们有多少。

Select ClientId, COUNT(distinct TypeId) as cnt
from tblOrders o
group by ClientId
Having COUNT(distinct TypeId) >= 2

COUNT(distinct TypeId)这是真的有效。它将计算特定ClientId的TypeId的不同数量。如果你说了5种不同的类型,那么将有条款的条件改为5

这是一个小样本DataSet

ClientId    TypeId
1              1
1              2
1              2
2              2
2              1
3              1
3              1

以下是生成的查询,它将排除客户端3,因为它只有Type1

的订单

结果集

ClientId    cnt
1            2
2            2

如果您有许多不同的TypeId,但只想检查Type1和Type2,将这些ID放在where子句中

where TypeId in (1,2)