代码之家  ›  专栏  ›  技术社区  ›  Lopoc

SQL:级联联合和联接

  •  5
  • Lopoc  · 技术社区  · 15 年前

    我在两张桌子之间有一个工会组织

    SELECT ID_1,
           name_1,
           surname_1,
      FROM T_ONE
     UNION
    SELECT ID_2,
           name_2,
           surname_2
      FROM TABLE_2
    

    我想加入这个结果 UNION 与另一个表或甚至与所有表一起操作 TABLE_1 .

    我如何处理这个新表的结果 联合 .

    例如,在上一个之后 联合 :

    RIGHT JOIN TABLE_3
            ON TABLE_3.ID_3 = XXXXXXXXXXXXXXXXXXXX.ID_2
    

    我真的不知道要处理由 联合 .

    4 回复  |  直到 6 年前
        1
  •  13
  •   gbn    15 年前

    在这里使用类似“foo”的派生表,然后根据需要再次联接:

    SELECT
        *
    FROM
        TABLE_3
        LEFT JOIN
        (
        SELECT ID_1, name_1, surname_1, FROM T_ONE
        UNION --ALL would be more efficient if results do not overlap, as van's comment said
        SELECT ID_2, name_2, surname_2 FROM TABLE_2
        ) foo  ON TABLE_3.ID_3 = foo.ID_1
    

    使用左连接:比右连接容易混淆。

        2
  •  2
  •   MaxiWheat    15 年前

    您需要在以下两个选项中提供联接:

    SELECT ID_1, name_1, surname_1, FROM T_ONE
    RIGHT JOIN TABLE_3 ON TABLE_3.ID_3 = T_ONE.ID_1
    
    UNION
    
    SELECT ID_2, name_2, surname_2 FROM TABLE_2
    RIGHT JOIN TABLE_3 ON TABLE_3.ID_3 = TABLE_2.ID_2
    

    或者类似的。不要忘记联合会消除重复项,因此如果要包括重复项,请使用union all

        3
  •  2
  •   stealthyninja michkra    13 年前
    SELECT ID_1, name_1, surname_1, FROM T_ONE
    
    from
    (SELECT ID_1, name_1, surname_1, FROM T_ONE
    UNION 
    SELECT ID_2, name_2, surname_2 FROM TABLE_2 ) foo
    
    left join TABLE_3 
    
    ON TABLE_3.ID_3 =foo.ID_2
    
        4
  •  0
  •   wandmdave    6 年前

    为那些提出要求的人扩展上面的GBN答案。下面是如何将联合作为左联接的第一部分来完成它。

    SELECT table3.phone, foo.fname, foo.lname, foo.email
    FROM
    (SELECT table1.fname,table1.lname,table1.email
        FROM table1
    UNION
    SELECT table2.fname,table2.lname,table2.email
        FROM table2
    ) foo
    LEFT JOIN table3
    ON foo.lname = table3.lname