Выберите используемые и неиспользуемые строки из ограничений внешнего ключа

#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, «НЕТ», «ДА») в качестве статуса использовать это в вашем запросе, сработает ли это?