2010-01-15 8 views
2

Veuillez regarder l'image suivante, j'ai expliqué mes exigences dans l'image.Utilisation de la condition OU (opérateur IN) dans la clause Where comme condition

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

Je ne peux pas utiliser ici WHERE UsageTypeid IN(1,2,3,4) parce que cela va se comporter comme une condition OR chercher tous les dossiers.

Je veux juste ces enregistrements, de la première table, qui sont attachés avec tous 4 ShipmentToID.

Tous les autres qui sont attachés avec 3 ou moins ShipmentToID s ne sont pas nécessaires dans le jeu de résultats.

Merci.

Répondre

1

si (EntityId, UsageTypeId) est unique:

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 

autrement, 4 voies pour rejoindre les 4 champs,

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 

vous voulez indice approprié sur (EntityId, UsageTypeId) il ne se bloque pas ..

0

Cette méthode est préférable à la méthode de jointure multiple contre la même table, car vous pouvez simplement modifier la clause IN et la COUNT sans avoir besoin d'ajouter ou de soustraire plusieurs tables à la requête lorsque votre liste des modifications des 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

S'il n'y aura jamais de doublons du combo UsageTypeId-entityID dans la 2ème table, donc vous ne verrez jamais:

EntityUsageTypeId | EntityId | UsageTypeId
22685 | 4477 | 1
22687 | 4477 | 1

Vous pouvez compter les EntityIds correspondants dans cette table.

WHERE (count(*) in <tablename> OÙ 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 
Questions connexes