2012-02-24 2 views
2

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

Я пытаюсь присоединиться к 3-мя различным таблицам, и я считаю, что то, что я хочу, эквивалентно FULL OUTER JOIN (не поддерживается MySQL, как я понимаю) на всех трех таблицах. Рассмотрим диаграмму Венна с тремя кругами; Я хочу, чтобы полный союз всех трех кругов, включая полное пересечение, все три парных соединения (где одна таблица возвращает 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)) 

ТИА за вашу помощь, и ваша светлость. :)

+0

Я предполагаю, что я должен отметить, ... «один маленький улов», который, кажется, делает это отличным от большинства вопросов о соединении нескольких таблиц, заключается в том, что я хочу сохранить все данные из всех трех таблиц в объединенной таблице. –

+1

Посмотрите на решение здесь: http://stackoverflow.com/questions/2384298/mysql-full-outer-join-syntax-error – diaho

+0

Итак, из ответа Cletus на три таблицы: вы уверены, что это не приведет в двойную дату в объединенной таблице? –

ответ

1

имитировать ваше полное внешнее соединение, я бы предварительно-запрос только те уникальные идентификаторы вы надеетесь, то LEFT JOIN друг к другу ...

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 

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

  • Нет связанных вопросов^_^