Использование (оператор IN) ИЛИ условия в предложении Где в качестве условия И - PullRequest
2 голосов
/ 16 января 2010

Пожалуйста, посмотрите на следующее изображение, я объяснил свои требования на изображении.

альтернативный текст http://img30.imageshack.us/img30/5668/shippment.png

Я не могу использовать здесь WHERE UsageTypeid IN(1,2,3,4), потому что это будет вести себя какOR условие и получить все записи.

Мне нужны только те записи первой таблицы, которые прикреплены с all 4 ShipmentToID.

Все остальные, к которым добавлено 3 или менее ShipmentToIDs не нужны в наборе результатов.

Спасибо.

Ответы [ 4 ]

1 голос
/ 16 января 2010

, если (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 голосов
/ 16 января 2010
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
0 голосов
/ 16 января 2010

Если во 2-й таблице никогда не будет дубликатов комбинированного списка UsageTypeId-EntityId, вы никогда не увидите:

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

Вы можете посчитать соответствующие EntityIds в этой таблице.

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

0 голосов
/ 16 января 2010

Этот способ предпочтительнее, чем метод множественного объединения с одним и тем же таблицей, поскольку вы можете просто изменить предложение IN и COUNT, не добавляя и не вычитая больше таблиц в запросе при изменении списка идентификаторов:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...