ВЫБЕРИТЕ CASE / JOIN, когда нет строк - PullRequest
2 голосов
/ 17 июля 2011

Извините, это немного головная боль. Начну с примера:

Таблица:

TownCountry

Record |  Town  | CountryCode
-------+--------+-------------
1      | London | A1
2      | Cardiff| A2
3      | Hull   | A1
4      | Luton  | A1

ReFData

Type    |  Code   | Country
--------+---------+-------------
Country | A1      | England
Country | A2      | Wales

Если мой запрос:

select a.Town, b.Country from TownCountry a, RefData b, TownCountry c
where a.Record=1
and b.Code=c.CountryCode and c.Record=2

Я получаю:

London | Wales

Однако, если я изменю код Уэльса на A3 и оставлю запрос таким же, результат не возвращает строк.

То, что я хочу в примере, где Уэльс A3, для моего результата:

London | (empty)

Я пробовал COALESCE:

select a.Town, COALESCE(b.Country,'empty') from TownCountry a, RefData b, TownCountry c
where a.Record=1
and b.Code=c.CountryCode and c.Record=2

но это не вернуло строк

Я также пытался выбрать регистр, правое и левое соединения, но строк по-прежнему нет.

Вот более простой пример, который мой хороший друг привел мне во время обсуждения:

Город

Record |  Town  
-------+--------
1      | London 
2      | Cardiff
4      | Luton

select a.Town, b.Town, c.town, d.Town
from Towns a, Towns b, Towns c, Towns d
where a.Reocrd=1 and b.Reocrd=2 and c.Reocrd=3 and a.Reocrd=4

Я хочу вернуть

a.Town | b.Town | c.Town | d.Town
-------+--------+--------+--------
London | Cardiff| NULL   | Luton

Любая помощь высоко ценится.

Ответы [ 3 ]

0 голосов
/ 17 июля 2011

Вы не на самом деле делаете соединения, и вам нужно внешнее соединение (то есть LEFT JOIN).

То, что вы хотите, выглядит примерно так:

select a.Town, b.Country
from TownCountry a
left join RefData b on b.Code = a.CountryCode
left join TownCountry c on c.CountryCode = b.Code and c.Record=2
where a.Record=1;

РЕДАКТИРОВАНИЕ : Я вставил "и c.Record = 2" в предложение объединения. Этот маленький трюк хорош - он сохраняет условие, но не требует объединенной строки

0 голосов
/ 17 июля 2011

Проблема в том, что в таблице перевода нет записи для пустых необработанных значений. В результате в таблице переводов ничего не найдено, поэтому строки не возвращаются.

Эту конкретную проблему можно решить, добавив строку в таблицу перевода или, точнее, используя объединение для добавления строки:

select a.Town, b.Country from TownCountry a, 
(select Code, Country from RefData b
union select '' as Code, 'Not found' as Country from RefData c), TownCountry c
where a.Record=1
and b.Code=c.CountryCode and c.Record=2

SQL Love, Крыло

0 голосов
/ 17 июля 2011

Если вы хотите сохранить строки даже там, где нет совпадений в столбце, к которому вы присоединяетесь, вам нужно сделать OUTER JOIN вместо INNER JOIN.

http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=/com.ibm.db2.luw.apdv.porting.doc/doc/r0052878.html

...