Как получить идентификатор из результатов в двух таблицах - PullRequest
0 голосов
/ 11 февраля 2010

Рассмотрим заказ. В заказе будет одна или несколько позиций. Каждая позиция предназначена для определенного продукта.

Учитывая таблицу фильтров с парой продуктов, как я могу получить идентификаторы заказа, в которых по крайней мере все продукты перечислены во второй таблице?

table Orders(
  OrderId int
)

table LineItems (
  OrderId int,
  LineItemId int,
  ProductId int
)

table Filter (
  ProductId int
)

данные

Orders
OrderId
--------
1
2
3


LineItems
OrderId   LineItemId   ProductId
-------   ----------   ---------
1         1            401
1         2            502
2         3            401
3         4            401
3         5            603
3         6            714

Filter
ProductId
---------
401
603

Желаемый результат запроса: Код заказа: 3

Ответы [ 2 ]

1 голос
/ 11 февраля 2010

Давек близко. Сначала необходимо сузить набор результатов, чтобы он включал только элементы, соответствующие таблице фильтра, а затем получить результат по счету:

select orderId 
from lineitems 
where ProductId 
  in (select productId from filter)
group by orderid
having count(distinct productid) 
  = (select count(distinct productid) from filter)

или с использованием объединений вместо:

select orderId 
from lineitems li
  inner join filter f on li.productId = f.productid
group by orderid
having count(distinct li.productid) 
  = (select count(distinct productid) from filter)

Я прошел через QA, и они выполнили одно и то же, но с приличным набором данных я бы предположил, что объединение будет работать лучше.

1 голос
/ 11 февраля 2010
select orderid
from lineitems
group by orderid
having count(distinct productid) 
  >= (select count(distinct productid) from filter)

может работать (не уверен насчет термина having, так как я не могу проверить его на своем домашнем ящике).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...