2010-01-15 78 views
2

请看下面的图像,我已经在图像中解释了我的要求。在Where子句中使用(IN运算符)OR条件作为AND条件

alt text http://img30.imageshack.us/img30/5668/shippment.png

我不能在这里使用WHERE UsageTypeid IN(1,2,3,4),因为这将表现为一个OR条件和获取的所有记录。

我只想要第一张表的所有记录,这些记录都附有全部4 ShipmentToID

结果集中不需要所有其他附加3或更少的ShipmentToID s。

谢谢。

回答

1

如果(EntityId, UsageTypeId)是独一无二的:

select s.PrimaryKeyField, s.ShipmentId from shipment s, item a 
where s.PrimaryKeyField = a.EntityId and a.UsageTypeId in (1,2,3,4) 
group by s.PrimaryKeyField, s.ShipmentId having count(*) = 4 

否则,4路参加了4场,

select distinct s.* from shipment s, item a, item b, item c, item d where 
s.PrimaryKeyField = a.EntityId = b.EntityId = c.EntityId = d.EntityId and 
a.UsageTypeId = 1 and b.UsageTypeId = 2 and c.UsageTypeId = 3 and 
d.UsageTypeId = 4 

你要在适当的(EntityId, UsageTypeId)指数因此它不挂.. 。

0

这种方式比同样的表方法更适合多重连接,因为您可以简单地修改IN子句和COUNT而不需要更多的表增加或减少到查询时,您的ID的变化列表:

select EntityId, ShipmentId 
from (
    select EntityId 
    from (
     select EntityId 
     from EntityUsage eu 
     where UsageTypeId in (1,2,3,4) 
     group by EntityId, UsageTypeId 
    ) b 
    group by EntityId 
    having count(*) = 4 
) a 
inner join Shipment s on a.EntityId = s.EntityId 
0

如果永远不会有在第二表中的UsageTypeId-ENTITYID组合的重复,所以你永远不会看到:

EntityUsageTypeId | EntityId |用法类型ID
22685 | 4477 | 1
22687 | 4477 | 1

您可以计算该表中的匹配EntityIds。

WHERE (count(*) in <tablename> WHERE ENTITYID = 4477)= 4

0
DECLARE @numShippingMethods int; 
SELECT @numShippingMethods = COUNT(*) 
FROM shippedToTable; 

SELECT tbl1.shipmentID, COUNT(UsageTypeId) as Usages 
FROM tbl2 JOIN tbl1 ON tbl2.EntityId = tbl1.EntityId 
GROUP BY tbl1.EntityID 
HAVING COUNT(UsageTypeId) = @numShippingMethods