Oracle: убедитесь, что каждое значение, которое используется оператором IN, всегда возвращает одну строку, даже если нет соответствующих данных - PullRequest
2 голосов
/ 08 октября 2019

Ниже приведен мой SQL-запрос, чтобы определить, сделал ли несколько идентификаторов определенный заказ. Он объединяет 2 таблицы - REQUEST и CODE, чтобы вернуть имя элемента, которое находится в CODE:

SELECT GETCLIENT(a.CLI_ID,a.CLI_ID_SCH) AS Client, a.FILLER_FCTY AS Facility, a.FILLER_ORD AS OrderNumber, a.ORD_DATE AS DateTime, b.OBSC_DESC AS ItemName 
FROM REQUEST a, CODE b
WHERE a.SERV_ID = b.OBSID
AND GETCLIENT(a.CLI_ID,a.CLI_ID_SCH) IN
('AZZ1',
'BCA2',
'BDG3',
'BMZ4',
'BSH5',
'CAS6',
'CBW7')
AND FILLER_FCTY = 'TGY'
AND SERV_ID = '00034'
AND OBSC_DESC = 'Item A'
ORDER BY 1

. Приведенный выше запрос вернет первые 6 идентификаторов (AZZ1, BCA2,BDG3, BMZ4, BSH5 и CAS6) с ожидаемым результатом, поскольку они сделали соответствующий заказ, однако, поскольку последний идентификатор CBW7 никогда не делал ни одного заказа, который имеет отношение к указанному номеру товара и названию товара,для этого идентификатора результат не возвращается.

Как создать этот идентификатор или любой идентификатор для возврата строки, даже если в базе данных нет совпадений? Я пытался использовать OR GETCLIENT(a.CLI_ID,a.CLI_ID_SCH) IS NULL, но все еще не возвращал строку для последнего идентификатора.

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Никогда не используйте запятые в предложении FROM. Всегда используйте правильный, явный, стандартный JOIN синтаксис.

В вашем случае вам нужен LEFT JOIN. Это немного сложно, отчасти потому, что неясно, откуда приходят столбцы. Вы должны квалифицировать все ссылки на столбцы. И используйте значимые псевдонимы таблиц, а не произвольные буквы.

Итак, я думаю, что это то, что вы хотите:

SELECT l.Client,
       r.FILLER_FCTY AS Facility, r.FILLER_ORD AS OrderNumber, r.ORD_DATE AS DateTime,
       c.OBSC_DESC AS ItemName 
FROM (SELECT 'AZZ1' as client FROM DUAL UNION ALL
      SELECT 'BCA2' FROM DUAL UNION ALL
      SELECT 'BDG3' FROM DUAL UNION ALL
      SELECT 'BMZ4' FROM DUAL UNION ALL
      SELECT 'BSH5' FROM DUAL UNION ALL
      SELECT 'CAS6' FROM DUAL UNION ALL
      SELECT 'CBW7' FROM DUAL
     ) l LEFT JOIN
     (REQUEST r JOIN
      CODE c
      ON r.SERV_ID = c.OBSID AND
         ?.FILLER_FCTY = 'TGY' AND
         ?.SERV_ID = '00034' AND
         ?.OBSC_DESC = 'Item A'
     )
     ON GETCLIENT(r.CLI_ID, r.CLI_ID_SCH) = L.CODE      
ORDER BY 1;

? для псевдонимов таблицы, чтобы определить, где столбцыродом из.

0 голосов
/ 08 октября 2019

Создайте временную таблицу из следующих значений ('AZZ1', 'BCA2', 'BDG3', 'BMZ4', 'BSH5', 'CAS6', 'CBW7'), затем используйте левое соединение с этой временной таблицей.

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