SQL: проверка всех строк на соответствие ряду строк - PullRequest
1 голос
/ 10 ноября 2011

У меня есть две таблицы, которые выглядят так:

Поставщик

  SN         SNAME  Stat   City
+----------+-------+----+--------+
| S1       | Smith | 20 | London |
| S2       | Jones | 10 | Paris  |
| S3       | Blake | 30 | Paris  |
| S4       | Clark | 20 | London |
| S5       | Adams | 30 | Athens |
+----------+-------+----+--------+

Пересылка * * 1006 SN PN QTY +----+----+-----+ | S1 | P1 | 300 | | S1 | P2 | 200 | | S1 | P3 | 400 | | S1 | P4 | 200 | | S1 | P5 | 100 | | S1 | P6 | 100 | | S2 | P1 | 300 | | S2 | P2 | 400 | | S3 | P2 | 200 | | S4 | P2 | 200 | | S4 | P4 | 300 | | S4 | P5 | 400 | +----+----+-----+ У меня есть следующая находка: Перечислите имена поставщиков (SNAME) для тех поставщиков, которые отправляют по крайней мере все те детали (PN), которые поставляются поставщиком S2. Другими словами, мне нужно перечислить всех тех поставщиков, которые поставляют как минимум P1 и P2, хотя, очевидно, мой запрос должен быть сосредоточен больше на рассматриваемом вопросе. Я почти уверен, что должен использовать какую-то форму НЕ СУЩЕСТВУЕТ - возможно, двойника не существует, чтобы достичь этого. Я попытался выполнить самостоятельное соединение таблицы отгрузки с самим собой, но не могу понять, как получить ее, кроме проверки на ЛЮБОЙ элемент, который отображается в PN для S2, и вместо этого проверить, чтобы убедиться, что ВСЕ детали для S2 находятся в список перед включением имени в результат.

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Для этого я использовал общее табличное выражение:

--CTE will contain records from the Supplier you are looking to check against
WITH desiredSN AS
(
   SELECT s.SN, s.PN 
   FROM Shipment AS s
   WHERE s.SN = 'S2'
)
--SELECT will join all other shippers with each record of your Supplier S2 here
SELECT s.SN
FROM Shipment AS s
INNER JOIN desiredSN AS d ON s.PN = d.PN
WHERE s.SN != 'S2'
GROUP BY s.SN
--Having ensures that the count of your old supplier matches
--the number a potential supplier overlaps with
HAVING COUNT(1) =
(
   SELECT COUNT(1)
   FROM desiredSN AS d
)

Если вы не хотите использовать CTE, вместо этого вы можете использовать подзапросы:

SELECT s.SN
FROM Shipment AS s
INNER JOIN 
(
   SELECT s.SN, s.PN
   FROM Shipment AS s
   WHERE s.SN = 'S2'
)
AS d ON s.PN = d.PN
WHERE s.SN != 'S2'
GROUP BY s.SN
HAVING COUNT(1) =
(
   SELECT COUNT(1)
   FROM Shipment AS s
   WHERE s.SN = 'S2'
)
1 голос
/ 10 ноября 2011

Не могли бы вы использовать вложенный оператор выбора для уточнения ваших результатов?

Например:

SELECT SNAME FROM Supplier
INNER JOIN Shipment ON Supplier.SN = Shipment.SN
WHERE Shipment.PN IN (SELECT PN FROM Shipment WHERE SN = S2)

Таким образом, детали (PN) ограничиваются только теми, которые продаются S2.

отредактировано изменило выражение на

Shipment.PN IN (SELECT PN FROM Shipment WHERE SN = S2)

Теперь, даже если они продали все, они вернутся, только если продадут по крайней мере того, что продает S2.

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