【问题标题】:Joining 2 SQL SELECT result sets into one将 2 个 SQL SELECT 结果集合并为一个
【发布时间】:2011-01-20 00:50:06
【问题描述】:

我有 2 个选择语句,返回的数据如下:

Select 1
col_a   col_b

Select 2
col_a   col_c

如果我做联合,我会得到类似的东西

col_a col_b

并且行加入。我需要的是这样:

col_a  col_b  col_c

加入col_a中的数据

【问题讨论】:

    标签: sql join select subquery alias


    【解决方案1】:

    使用完全外连接:

    select 
       a.col_a,
       a.col_b,
       b.col_c
    from
       (select col_a,col_bfrom tab1) a
    join 
       (select col_a,col_cfrom tab2) b 
    on a.col_a= b.col_a
    

    【讨论】:

    • 投影列表中可能需要COALESCE(a.col_a, b.col_a) AS col_a 之类的内容。
    【解决方案2】:

    使用 JOIN 连接子查询并使用 ON 表示每个子查询中的行必须匹配的位置:

    SELECT T1.col_a, T1.col_b, T2.col_c
    FROM (SELECT col_a, col_b, ...etc...) AS T1
    JOIN (SELECT col_a, col_c, ...etc...) AS T2
    ON T1.col_a = T2.col_a
    

    如果 col_a 的某些值在 T1 中但不在 T2 中,则可以改用 LEFT OUTER JOIN。

    【讨论】:

    • 问题是,我有选择语句,而不是表。
    • @Vance:然后使用派生表和别名,如我更新的答案所示。
    • 如果您的选择很长并且您的 SQL 实现了它,您可以使用 WITH 语句。使用 Select1 AS (select ..), Select2 AS (select ...) SELECT COALESCE(T1.col_a, T2.col_a) AS col_a, T1.col_b, T2.col_c FROM Select1 T1 FULL JOIN Select2 T2 ON T1.col_a = T2.col_a
    • @MarkByers 您的查询适用于较小的数据集。在我的例子中,T1 有 100,000 条记录,而 T2 有另外 100,000 条记录。我想使用右外连接来获取 T2 中不在 T1 中的记录。可以优化查询以获取大量记录吗?
    【解决方案3】:
    SELECT table1.col_a, table1.col_b, table2.col_c 
      FROM table1 
      INNER JOIN table2 ON table1.col_a = table2.col_a
    

    【讨论】:

    • 或者使用LEFT JOINRIGHT JOIN,如果在table1.col_a = table2.col_a的左侧或右侧的Tables中有行
    猜你喜欢
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    相关资源
    最近更新 更多