2010-01-15 75 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