SQL - объединить несколько таблиц, с одним небольшим уловом - PullRequest
2 голосов
/ 24 февраля 2012

Заранее извиняюсь, если этот конкретный вопрос уже был задан и получен ответ ... существует так много разных способов использования команды JOIN, что может быть трудно найти точный ответ на данную проблему.Я новичок в SQL, поэтому ... если решение существует, не стесняйтесь указывать мне на него.

Я пытаюсь объединить 3 разные таблицы и считаю, что то, что я хочу, эквивалентноFULL OUTER JOIN (не поддерживается MySQL, как я понимаю) на всех 3 таблицах.Рассмотрим диаграмму Венна с 3 кружками;Мне нужно полное объединение всех трех окружностей, включая полное пересечение, все три парных соединения (где одна таблица возвращает NULL) и все три отдельных экземпляра (где две таблицы возвращают NULL).Я верю, что то, что у меня есть, сработает, но это грубая сила, и я уверен, что есть более эффективный способ.Я также немного обеспокоен своим использованием WHERE NOT EXISTS, поэтому, пожалуйста, исправьте меня, если это необходимо.Вот суть моего кода:


    // Intersection of all three tables
    SELECT [table1.cols], [table2.cols], [table3.cols]
        FROM table1
            INNER JOIN table2
                ON table1.col1 = table2.col1
            INNER JOIN table3
                ON table1.col1 = table3.col1

    UNION ALL

    // Intersection of tables one and two
    SELECT [table1.cols], [table2.cols], [NULLS]
        FROM table1
            INNER JOIN table2
                ON table1.col1 = table2.col1
                    WHERE NOT EXISTS (table1.col1 = table3.col1)

    UNION ALL

    // Intersection of tables two and three
    SELECT [NULLS], [table2.cols], [table3.cols]
        FROM table2
            INNER JOIN table3
                ON table2.col1 = table3.col1
                    WHERE NOT EXISTS (table2.col1 = table1.col1)

    UNION ALL

    // Intersection of tables three and one
    SELECT [table1.cols], [NULLS], [table3.cols]
        FROM table3
            INNER JOIN table1
                ON table3.col1 = table1.col1
                    WHERE NOT EXISTS (table3.col1 = table2.col1)

    UNION ALL

    // Only in table one
    SELECT [table1.cols], [NULLS], [NULLS]
        FROM table1
            WHERE NOT EXISTS ((table1.col1 = table2.col1))
            AND NOT EXISTS ((table1.col1 = table3.col1))

    UNION ALL

    // Only in table two
    SELECT [NULLS], [table2.cols], [NULLS]
        FROM table2
            WHERE NOT EXISTS ((table2.col1 = table1.col1))
            AND NOT EXISTS ((table2.col1 = table3.col1))

    UNION ALL

    // Only in table three
    SELECT [NULLS], [NULLS], [table3.cols]
        FROM table3
            WHERE (NOT EXISTS (table3.col1 = table1.col1))
            AND (NOT EXISTS (table3.col1 = table2.col1))

TIA за вашу помощь и вашу милость.:)

1 Ответ

1 голос
/ 25 февраля 2012

, чтобы имитировать ваше полное внешнее соединение, я бы предварительно запросил только УНИКАЛЬНЫЕ ИД, которые вы ожидаете, затем ЛЕВЫЕ СОЕДИНЕНИЯ друг с другом ...

select
      AllPossibleKeys.CommonID,
      T1a.*,
      T2a.*,
      T3a.*
   from
      ( select distinct T1.col1 as CommonID
           from table1 T1
        UNION
        select distinct T2.col1 as CommonID
           from table2 T2
        UNION
        select distinct T3.col1 as CommonID
           from table1 T3 ) as AllPossibleKeys

      LEFT JOIN table1 T1a
         on AllPossibleKeys.CommonID = T1a.col1

      LEFT JOIN table2 T2a
         on AllPossibleKeys.CommonID = T2a.col1

      LEFT JOIN table3 T3a
         on AllPossibleKeys.CommonID = T3a.col1
...