2016-11-14 2 views
0

Я пытаюсь создать инструкцию select. Я хочу выбрать записи, содержащие все записи из подзапроса.Выберите записи, если они содержат все результаты подзапроса

У меня есть подзапрос, как:

SELECT P.pid 
FROM Parts P 
INNER JOIN Manifacturers M INNER JOIN M.mid ON P.pid 
WHERE M.name = 'Mercedes' 

Я хочу, чтобы выбрать поставщиков, если они продают все эти части. Я пробовал пару вещей:

SELECT s.name 
FROM Suppliers S 
INNER JOIN Parts P1 ON S.pid = P1.pid 
WHERE p1.pid IN (SELECT P.pid 
    FROM Parts P 
    INNER JOIN Manifacturers M INNER JOIN M.mid ON P.pid 
    WHERE M.name = 'Mercedes') 

Это явно не удалось. Это возвращает поставщиков, если у них есть какие-либо детали. На самом деле мне удается сблизиться с помощью INTERSECT:

SELECT P1.pid 
FROM Suppliers S 
INNER JOIN Parts P1 ON S.pid = P1.pid 
INTERSECT 
SELECT P.pid 
FROM Parts P 
INNER JOIN Manifacturers M INNER JOIN M.mid ON P.pid 
WHERE M.name = 'Mercedes' 

Это возвращает правильный ИДП, но этот синтаксис не позволяет мне вернуться s.name. Это не позволит мне добавить какое-либо поле, которое не существует во втором запросе.

ответ

1

Вы должны попробовать использовать условную COUNT()

SELECT COUNT(CASE WHEN M.name = 'Mercedes' THEN 1 END) AS total_mercedes 
FROM Parts P 
INNER JOIN Manifacturers M INNER JOIN M.mid ON P.pid 

Тогда ваши изготовляет должны иметь одинаковое количество деталей.

SELECT s.name, 
     COUNT(CASE WHEN M.name = 'Mercedes' THEN 1 END) AS total_supplier 
FROM Suppliers S 
INNER JOIN Parts P1 ON S.pid = P1.pid 
INNER JOIN Manifacturers M INNER JOIN M.mid ON P.pid 
CROSS JOIN (SELECT COUNT(CASE WHEN M.name = 'Mercedes' THEN 1 END) AS total_mercedes 
      FROM Parts P 
      INNER JOIN Manifacturers M INNER JOIN M.mid ON P.pid 
      ) M 
GROUP BY s.name 
HAVING T.total_mercedes = total_supplier 

Другой вариант: LEFT JOIN.

Сначала вам нужно каждое Pid от Mercedes и каждого поставщика. Затем проверьте, есть ли какие-либо NULL ряды

SELECT S.name 
FROM (SELECT P.Pid 
     FROM Parts P 
     INNER JOIN Manifacturers M INNER JOIN M.mid ON P.pid 
     WHERE M.name = 'Mercedes' 
    ) M 
CROSS JOIN (SELECT DISTINCT S.name, 
      FROM Suppliers S 
      ) S 
LEFT JOIN Suppliers Sales 
     ON M.Pid = Sales.Pid 
    AND S.name = Sales.Name 
GROUP BY S.name 
HAVING COUNT(CASE WHEN Sales.Pid IS NULL THEN 1 END) = 0 
+0

@Matt Исправить 'CASE'. Но не см., Как вы можете упростить производную таблицу, вам нужно иметь базу со всей частью и поставщиком, прежде чем делать «LEFT JOIN» –

+0

Ой, я вижу это ... сначала я использую соединение с Производитель, но уже осознает Поставщика есть 'Pid'. –

+0

Да, это не biggie в любом случае, я просто думал, что это было чище без него. хороший ответ – Matt

Смежные вопросы