2015-08-27 3 views
0

Я пытаюсь выяснить, как написать SQL-запрос, который возвращает результат двух других операторов SELECT, каждый из которых имеет свой собственный JOIN. Вот сценарий:Одиночный SELECT, объединяющий несколько JOINs

Таблица 1 может иметь значения NULL в столбцах T1Number и/или T1State. В таблице 2 могут быть строки с соответствующим числом или состоянием. Я хочу, чтобы все строки из таблицы 1, но хочу заполнить любой NULL T1Number T2Number, когда совпадают состояния, и заполнить любой NULL T1State T2State при совпадении чисел. Я не хочу, строки из Table2, которые не имеют состояние соответствия или номер:

Table1:       Table2: 

Name T1Number T1State   T2Number T2State 
---- -------- -------   -------- ----- 
Joe 1   NULL   1   MA 
Bob NULL  CA    2   CA 
Dan NULL  NULL   3   FL 
Sam 4   NY    4   NY 
Ray 5   TX    8   PA 

Поэтому у меня есть один ЗЕЬЕСТ, чтобы получить номер:

SELECT 
    Table1.Name, 
    Table1.T1Number, 
    Table1.T1State, 
    Table2.T2Number, 
    Table2.T2State 
FROM Table1 
INNER JOIN Table2 ON Table2.T2State = Table1.T1State 
WHERE (Table1.T1Number IS NULL OR Table1.T1State IS NULL) 

Result: 

Name T1Number T1State T2Number T2State 
---- -------- ------- -------- -------  
Bob NULL  CA  2   CA 

И еще ЗЕЬЕСТ, чтобы получить Государство:

SELECT 
    Table1.Name, 
    Table1.T1Number, 
    Table1.T1State 
    Table2.T2Number 
    Table2.T2State 
FROM Table1 
INNER JOIN Table2 ON Table2.T2Number = Table1.T1Number 
WHERE (Table1.T1Number IS NULL OR Table1.T1State IS NULL) 

Result: 

Name T1Number T1State T2Number T2State 
---- -------- ------- -------- -------  
Joe 1   NULL  1   MA 

Как написать комбинированный оператор SELECT, который дает мне следующий желаемый результат?

Name Number State 
---- ------ -----  
Joe 1  MA 
Bob 2  CA 
Dan NULL NULL 
Sam 4  NY 
Ray 5  TX 

Я полагаю, мне нужен вмещающий ЗЕЬЕСТ, который делает LEFT JOIN между Table1 и объединением указанных запросов, но я знаю, что это намного легче, чем я делаю это. Спасибо заранее.

ответ

0

Вы можете использовать один оператор select без предложения where и инструкции case в вашей операции join. Что-то вроде:

SELECT t1.Name 
    , CASE WHEN t1.Number is null then t2.Number else t1.Number END as Number 
    , CASE WHEN t1.State is null then t2.State else t1.State end as State 
FROM Table1 t1 
LEFT JOIN Table2 t2 
ON CASE WHEN t1.Number is null THEN t1.State 
     ELSE CONVERT(varchar(1), t1.Number) END 
    = CASE WHEN t1.Number is null THEN tab2.State 
      ELSE CONVERT(varchar(1), t2.Number) END 
+0

Отлично - это делает трюк. Спасибо за вашу помощь. – MasterOfNone

Смежные вопросы