SQL UNION - 添加源

Posted

技术标签:

【中文标题】SQL UNION - 添加源【英文标题】:SQL UNION - Adding Source 【发布时间】:2018-02-21 22:14:33 【问题描述】:

我目前在两个查询中使用 UNION(请参阅下面的伪代码):

query1 
UNION
query2

我想在我的结果中添加一个额外的列,说明数据的来源。名为“Source”的新列将返回以下值之一:“1”、“2”或“both”。

能够处理“两者”非常重要,因为 query1 和 query2 将有相似的结果和许多重叠的记录。如果有人可以帮助我指出正确的方向,特别是如何处理“两者”的情况,那将不胜感激!

示例: 如果 query1 有一行“Apple,Yellow,Bob”并且 query2 有同一行,那么我希望的结果是:

“苹果,黄色,鲍勃,两者”

各个查询本身不会有重复项,但 query1 和 query2 中可能存在同一行(如上所示)。

【问题讨论】:

编辑您的问题并提供示例数据、所需结果和数据库标签。此外,解释如何处理其中一个或两个来源中的重复。 【参考方案1】:

向查询 1 和查询 2 添加 Source 字段:

select 1 as source, ...
from table1
union
select 2 as source, ...
from table2

【讨论】:

这让我很接近 - 但如何处理“两者”的情况?如果这有助于更好地解释我的问题,我只是添加了一个示例! :) 不可能两者兼有,只有一个 UNION 你会从每个查询中得到一行。 如果你想拥有 Both,你需要用 GROUP BY 子句将 UNION 包装在另一个查询中 你能展示如何做到这一点的伪代码吗?如果它同时在 query1 和 query2 中,我确实希望新列说“两者”。现在你的初步答案是好的,但不处理我发布的例子/“两者”的情况。感谢您的帮助和时间! SELECT CASE WHEN count(*) = 1 THEN Source ELSE 'Both' END AS Source, ... FROM (联合查询) GROUP BY Source, ...【参考方案2】:

这是一种方法

WITH T
     AS (SELECT '1' AS Source,
                Col1,
                Col2,
                Col3
         FROM   table1
         UNION ALL
         SELECT '2' AS Source,
                Col1,
                Col2,
                Col3
         FROM   table2)
SELECT CASE
         WHEN MAX(Source) = MIN(Source) THEN Source
         ELSE 'Both'
       END AS Source,
       Col1,
       Col2,
       Col3
FROM   T
GROUP  BY Col1,
          Col2,
          Col3 

【讨论】:

【参考方案3】:

另一种方法

SELECT col1
    ,col2
    ,source = CASE 
        WHEN count(DISTINCT source) > 1
            THEN 'Both'
        ELSE max(source)
        END
FROM (
    SELECT col1 ,col2, source = 'source1'
    FROM source1
    UNION ALL
    SELECT col1, col2, source = 'source2'
    FROM source2
    ) u
GROUP BY col1, col2

【讨论】:

【参考方案4】:

您可以像这样使用额外的列 col4

select col1,col2,col3,sum(col4) 
from(    
    Select col1, col2, col3, 1 as col4 from table1
    UNION 
    Select col1,col2,col3, 2 as col4 from table4
)
group by col1,col2,col3

col4=1 的记录只存在于 table1 中。

col4=2 的记录只存在于 table2 中。

col4=3的记录在table1+table中都存在

【讨论】:

【参考方案5】:

你可以试试这个

 SELECT
    a.col1 , a.col2,
    CASE WHEN MAX(a.Source) <> MIN(a.Source) 
      THEN 'BOTH'
     ELSE MAX(a.Source) END
    FROM
    (
    SELECT
    col1, col2 ,'Source2' AS Source
    FROM Table1

    UNION ALL 

    SELECT
    col1, col2 ,'Source1' AS Source
    FROM Table2
    ) a
    GROUP BY 
    a.col1 , a.col2

链接到Sample

【讨论】:

以上是关于SQL UNION - 添加源的主要内容,如果未能解决你的问题,请参考以下文章

将表名的“字段”添加到来自 UNION 的 SQL 结果?

我可以在 SQL 中使用 UNION 子句的查询中添加 ORDER BY 子句吗?

SQL 在使用 UNION 时返回的结果较少?

sql 在查询结果最后一行添加备注

使用联合向 SQL 查询添加更多表

使用 Union All 按日期顺序回显 SQL 数据