Left Outer Join где NULL в левой таблице - PullRequest
0 голосов
/ 26 июня 2018

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

ITEM_TABLE            TYPE_TABLE
--------------      -------------------
|Item|Type_ID|      |Type_ID|Type_Text|
--------------      -------------------
|  A |  3    |      |   1   | Table   |
|  B |  1    |      |   2   | Chair   |
|  C |  1    |      |   3   | Bench   |
|  D |  2    |      -------------------
|  E | NULL  |
|  F |  2    |
|  G |  1    |
|  H |  3    |
--------------

Я хочу, чтобы мой результат показывал значимую строку для типа, поэтому я объединяю две таблицы:

select 
    it.Item, tt.Type_ID
from 
    ITEM_TABLE it
    left outer join TYPE_TABLE tt
        on it.Type_ID = tt.Type_ID

Результат:

----------------
|Item|Type_Text| 
----------------
|  A | Bench   |
|  B | Table   |
|  C | Table   |
|  D | Chair   |
|  F | Chair   |
|  G | Table   |
|  H | Bench   | 
----------------

Обратите внимание, что для элемента E нет строки, поскольку он имеет ITEM_TABLE.Type_ID NULL, и это значение не может удовлетворить условию соединения it.Type_ID = tt.Type_ID.

Тем не менее, я хочу получить результат:

----------------
|Item|Type_Text| 
----------------
|  A | Bench   |
|  B | Table   |
|  C | Table   |
|  D | Chair   |
|  E | NULL    | * note this row here, not present in the actual result
|  F | Chair   |
|  G | Table   |
|  H | Bench   | 
----------------

Я пытался:

select 
    it.Item, tt.Type_ID
from 
    ITEM_TABLE it
    left outer join TYPE_TABLE tt
        on it.Type_ID = tt.Type_ID or it.Type_ID is null

, но это дало результат:

----------------
|Item|Type_Text| 
----------------
|  A | Bench   |
|  B | Table   |
|  C | Table   |
|  D | Chair   |
|  E | Table   |
|  E | Chair   |
|  E | Bench   |
|  F | Chair   |
|  G | Table   |
|  H | Bench   | 
----------------

, то есть три строки дляЭлемент E, по одному с каждым возможным TYPE_TABLE.Type_Text значением.

Итак, как мне получить желаемый результат, с помощью оператора соединения, понимающего, что значение NULL в столбце ITEM_TABLE.Type_ID должно дать NULL значение в столбце Type_Text в результате?

1 Ответ

0 голосов
/ 26 июня 2018

Этот запрос:

select it.Item, tt.Type_ID
from ITEM_TABLE it left outer join
     TYPE_TABLE tt
     on it.Type_ID = tt.Type_ID

Будет возвращать каждую строку в ITEM_TABLE независимо от того, оценивается ли в предложении on значение TRUE, FALSE или NULL.Вот rextester , демонстрирующий, что все строки возвращены.Несмотря на то, что rextester использует Postgres, вы получите такое же поведение в любой базе данных, потому что именно так работает SQL.

Теперь, если вам нужна строка, вы должны выбрать строку, а не идентификатор.Вы можете использовать coalesce(), чтобы указать другое значение при отсутствии совпадения:

select it.Item, coalesce(type_text, 'default')
from ITEM_TABLE it left outer join
     TYPE_TABLE tt
     on it.Type_ID = tt.Type_ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...