SQL для возврата набора данных, где встречаются несколько условий - PullRequest
1 голос
/ 03 мая 2019

У меня есть следующая таблица MS-Access:

╔═══════════╦══════════════╗
║ colPartNo ║ colOperation ║
╠═══════════╬══════════════╣
║ 1         ║ A            ║
╠═══════════╬══════════════╣
║ 1         ║ B            ║
╠═══════════╬══════════════╣
║ 1         ║ C            ║
╠═══════════╬══════════════╣
║ 2         ║ B            ║
╠═══════════╬══════════════╣
║ 2         ║ C            ║
╠═══════════╬══════════════╣
║ 3         ║ C            ║
╠═══════════╬══════════════╣
║ 3         ║ D            ║
╠═══════════╬══════════════╣
║ 3         ║ E            ║
╠═══════════╬══════════════╣
║ 4         ║ A            ║
╠═══════════╬══════════════╣
║ 4         ║ B            ║
╠═══════════╬══════════════╣
║ 4         ║ C            ║
╠═══════════╬══════════════╣
║ 4         ║ D            ║
╠═══════════╬══════════════╣
║ 5         ║ A            ║
╠═══════════╬══════════════╣
║ 5         ║ B            ║
╠═══════════╬══════════════╣
║ 5         ║ C            ║
╠═══════════╬══════════════╣
║ 6         ║ B            ║
╠═══════════╬══════════════╣
║ 6         ║ C            ║
╚═══════════╩══════════════╝

То, что я пытаюсь сделать и не могу обернуться, - это вернуть набор данных, который содержит только отдельные номера деталей, где номер детали содержит операции A, B и C. Номер детали может есть другие операции, но он ДОЛЖЕН иметь все три из них. Я могу получить отдельный список номеров деталей, но он включает детали, которые не имеют всех трех операций, используя следующую инструкцию:

SELECT DISTINCT tblPart_Info.Part_No, tblPart_Info.Operation
FROM tblPart_Info
WHERE (((tblPart_Info.Operation)="A" Or (tblPart_Info.Operation)="B" Or (tblPart_Info.Operation)="C"))
ORDER BY tblPart_Info.Part_No;

Набор данных, который я собираюсь получить, будет номерами деталей 1, 4 и 5

1 Ответ

3 голосов
/ 03 мая 2019

Это можно сделать с помощью условного агрегирования в предложении having:

SELECT pi.Part_No, tblPart_Info.Operation
FROM tblPart_Info as pi
GROUP BY pi.Part_No
HAVING SUM(IIF(pi.Operation = "A", 1, 0)) > 0 AND
       SUM(IIF(pi.Operation = "B", 1, 0)) > 0 AND
       SUM(IIF(pi.Operation = "C", 1, 0)) > 0;

Возвращает номера деталей. Если вам нужны исходные строки, используйте JOIN, IN или EXISTS, чтобы соединить их с исходной таблицей.

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