Многократные внешние объединения SQL (преобразование соединений t-sql в формат ANSI) - PullRequest
3 голосов
/ 29 февраля 2012

У меня есть 3 таблицы t1, t2, t3. Мне нужен набор результатов, основанный на этих условиях: t1 с внешним соединением на t2 (все строки t1), t1 с внешним соединением на t3 (все строки t1) и t2 с внешним соединением на t3 (все строки t2). Как использовать эти внешние 3 объединения в одном запросе? В основном я хочу преобразовать запрос формата t-sql в формат ANSI. Исходный запрос выглядит примерно так

Select * from t1, t2, t3
where t1.col1 *= t2.col1
  and t1.col2 *= t3.col1
  and t2.col2 *= t3.col2

Мне удалось использовать первые 2 соединения как

   Select * 
     from t1
left join t2 on t1.col1 = t2.col1
left join t3 on t1.col2 = t3.col1

Это работает правильно для первых 2 условий. Но не смог включить 3-е соединение. Может ли кто-нибудь предложить, как это сделать? Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 29 февраля 2012

Вы можете иметь несколько вариантов, все с разными наборами результатов.Кто из них был первоначальным намерением, трудно, если не невозможно, другим сказать:


( Вариация 1 - запрос Тобсея, сначала присоединитесь к t2, затем к t3, эквивалентно):

SELECT 
    * 
FROM
        t1
    INNER JOIN                                --- or LEFT JOIN
        t2 
            ON  t1.col1 = t2.col1
    LEFT JOIN 
        t3 
            ON  t1.col2 = t3.col1 
            AND t2.col2 = t3.col2     --- this line makes the first LEFT join
                                      --- equal to INNER join

( Вариация 2 - сначала присоединиться к t3, затем к t2):

SELECT 
    * 
FROM
        t1
    INNER JOIN                                --- or LEFT JOIN
        t3 
            ON  t1.col2 = t3.col1 
    LEFT JOIN 
        t2 
            ON  t1.col1 = t2.col1  
            AND t3.col2 = t2.col2 

(Вариант 3a - сначала присоедините t2 к t3, а затем присоедините t1 к этому соединению):

SELECT 
    * 
FROM
        t1
    LEFT JOIN
            t2 
        LEFT JOIN 
            t3 
                ON  t2.col2 = t3.col2  
        ON  t1.col1 = t2.col1
        AND t1.col2 = t3.col1 

Вариант 3 может иметь несколько дополнительных подвариаций, если заменить первое или второе LEFT соединениес присоединением INNER.

Полагаю, вам нужен вариант 3a.

3 голосов
/ 29 февраля 2012

От вашего вопроса, я думаю, вам нужны только строки из t3, которые соединяются со строками из t2, которые соединяются с t1:

SELECT 
    * 
FROM
    t1
    LEFT JOIN t2 ON t1.col1 = t2.col1
    LEFT JOIN t3 ON t1.col2 = t3.col1 AND t2.col2 = t3.col2

Это не будет включать строки из t2 и t3, которые объединяются в col2, еслистроки из t2 уже соединены с t1 на col1.

...