Полное внешнее объединение не показывает несогласованные строки - SQL - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь выполнить полное внешнее объединение двух таблиц, сопоставляя их с «Кодом продукта ПО» в таблице 1 и «Кодом продукта» в таблице 2. Каждый раз, когда я пытаюсь это сделать, появляются несколько продуктов.оставленные коды:

CABSCABS0000, DOORINTD0015, FLORCARP0001, EXCL0001, and FLORTILE0000

Каждый из этих кодов продуктов находится в таблице 2, но не в таблице 1.

Вот скриншоты таблиц, с которыми я работаю.

https://i.imgur.com/pFAfrAb.png

https://i.imgur.com/k0a3o57.png

И вот код, который я попробовал:

SELECT cost.[Actual Close]
    ,cost.[Project Name]
    ,cost.[Lot]
    ,cost.[Model]
    ,cost.[Elev]
    ,cost.[PO Product Code]
    ,cost.[Invoiced + Open] AS 'Invoiced + Open'
    ,rev.[Gross Sale] AS 'Gross Sale'

FROM Table1 cost FULL OUTER JOIN
     Table2 rev
    ON rev.[Product Code] = cost.[PO Product Code]  
WHERE rev.[Project Name] = cost.[Project Name] AND 
      rev.[Lot] = cost.[Lot];

Я должен также упомянуть, что код продуктаспецифичен для каждого имени проекта и лота, поэтому он добавляется в предложение «WHERE».

Вот вывод, который я получил, в котором отсутствуют 5 кодов ремесла, перечисленных выше.

https://i.imgur.com/EoMFc9v.png

Ответы [ 2 ]

1 голос
/ 11 июня 2019

FULL JOIN возвращает значения NULL в столбцах для строк, которые не совпадают ни в одной из таблиц.Ваше предложение WHERE отфильтровывает их - потому что сравнения NULL почти никогда не оцениваются как "истина" (исключение составляет IS NULL и NULL безопасные сравнения).

То, что вы хотите сделать, этопереместите эти условия в предложение ON.Вот где они все равно принадлежат, потому что они действительно JOIN условия:

FROM Table1 cost FULL OUTER JOIN
     Table2 rev
     ON rev.[Product Code] = cost.[PO Product Code] AND 
        rev.[Project Name] = cost.[Project Name] AND 
        rev.[Lot] = cost.[Lot];
0 голосов
/ 11 июня 2019

Это из-за вашего условия where

rev.[Project Name] = cost.[Project Name]
AND rev.[Lot] = cost.[Lot];

Поскольку те элементы, которые вы упомянули, не в table A, а в table B, вы в основном удаляете их с помощью предложения WHERE.

Если вы хотите, чтобы эти 5 элементов отображались, попробуйте удалить предложение where, а затем снова выполните запрос.

...