假设我有一个表客户端,具有字段ClientID,并且该客户端具有在另一个表Orders中加载的订单,其中外键ClientID用于链接两者。
客户可以有多个订单(1:N),但订单有不同的类型,由TypeID字段描述。
现在,我想选择包含多种类型订单的客户端。例如,具有类型1和2的订单的客户(两者,不是一个或另一个)。
如何构建此查询?我真的迷失在这里。
编辑:假设我在SQL Server上。
答案 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)