#sql #oracle
#sql #Oracle
Вопрос:
ну, у меня есть следующие таблицы.
components (prodNo, compNo, partNo)
parts (partNo, partName)
products (prodNo, prodName)
Мне нужно выбрать детали, которые используются ИЛИ не используются для производства другого продукта.
Я могу выбрать используемые части, но не знаю, как включить неиспользуемые части в результат.
В любом случае, результат должен быть по следующему шаблону
Результат
prodNo, prodName, partNo, partName, compNo, status
101 A 23 G 55 YES
NULL NULL 20 I NULL NO
34 F 555 S 58 YES
Ответ №1:
Вы должны использовать таблицу частей в качестве ядра запроса и выполнять внешние соединения с соответствующими таблицами компонентов и продуктов
Select products.prodNo, products.prodName, parts.partNo, parts.partName, components.compNo,
case when NVL(products.prodNo,0) > 0 then 'YES' else 'NO' end as status
from parts
left outer join components on components.partNo = parts.partNo
left outer join products on products.prodNo = components.prodNo
Комментарии:
1. он никогда не говорит «НЕТ». это просто исключает части, которые не используются
2. И вы уверены, что есть части, которые не имеют подключения к компонентам? выберите count(*) из частей, в которых parts.prodNo отсутствует ( выберите components.partNo из components)
3. хммм.. Это должно быть включено. Если вы запустите это: Выберите * из частей левое внешнее соединение компонентов в components.partNo = parts.partNo левое внешнее соединение продуктов в products.prodNo = components.prodNo; оно должно включать все части, даже если у них нет соответствующей строки в components или products
4. да, здесь отображаются все записи с одной строкой, содержащей NULLS — значит, эта часть не используется
5. @muaaz Хорошо, тогда проблема должна быть в том случае, когда where я поставил условие для prodNo. Я обновил свой ответ, не могли бы вы выполнить запрос и проверить, дает ли он вам результат?
Ответ №2:
Select p.prodNo,prd.prodName,prt.partNo,prt.partName,p.compNo,IF (p.prodNo IS NULL,"NO","YES") as status
from components as p
LEFT OUTER JOIN parts prd as p.partNo = prd.partNo
LEFT OUTER JOIN products prt on p.prodNo = prt.prodNo
Комментарии:
1. ЕСЛИ (p.prodNo ИМЕЕТ ЗНАЧЕНИЕ NULL, «НЕТ», «ДА») в качестве статуса использовать это в вашем запросе, сработает ли это?