SQL 联合两个 table 并将 table 名称保留在一列中

SQL Union two tables and keep table name in a column

我正在尝试联合两个 table,同时保留有关条目来自哪个 table 的信息。

例如,给定此输入

Table A
Column1   Column2
   0         X
   1         Y

Table B
Column1   Column2
   3         Z
   1         Y

我想这样结束:

Table C
Column1   Column2 Column3
   0         X        A
   1         Y        A
   3         Z        B

我尝试了 INSERT INTO 语句,但我无法在 Column3 中插入​​不同的文本而不从例如Table2

你想要 full outer join :

SELECT COALESCE(a.col1, b.col1), COALESCE(a.col2, b.col2), 
       (CASE WHEN a.col1 IS NOT NULL 
             THEN 'A' 
             ELSE 'B' 
        END)
FROM tableA a FULL OUTER JOIN
     tableB b
     ON b.col1 = a.col1;

你可以使用window函数row_number()

with cte as
(
select column1,column2,'A' as column3 from tableA
union all
select column1,column2,'B' as column3 from tableB
) , cte2 as
(
select * , row_number() over(partition by column1,column2 order by column3 ) rn
from cte
) select column1,column2,column3 from cte2 where rn=1

demo link

这样的事情可能是您寻求的解决方案。

SELECT Column1, Column2, 'A' AS Column3
FROM [Table A]
UNION
SELECT Column1, Column2, 'B' AS Column3
FROM (
    SELECT Column1, Column2 
    FROM [Table B]
        EXCEPT
    SELECT Column1, Column2 
    FROM [Table A]
) b

我很奇怪它不起作用。您的要求可以翻译为:

  1. 从集合 A 中取出所有行并添加值为 A 的列。
  2. 从集合 B 中取出所有不在集合 A 中的行,然后添加 值为 B 的列。
  3. Return 都是步骤 12.
  4. 的结果

这就是这个查询正在做的事情。

您可以尝试使用 UNION 结合 tableAtableB 然后使用 outer joinCASE WHEN 来制作它。

WITH CTE AS (
  SELECT Column1,Column2
  FROM TableA
  UNION 
  SELECT Column1,Column2
  FROM TableB
)
SELECT t1.*,(case when t2.COLUMN1 is NOT null THEN 'A' ELSE 'B' END) Column3
FROM CTE t1 
LEFT JOIN  TableA  t2 on t1.COLUMN1 = t2.COLUMN1 and t1.COLUMN2 = t2.COLUMN2

sqlfiddle

Column1 Column2 Column3
0       X       A
1       Y       A
3       Z       B

您似乎想要 a 中的行,然后是 b 中的 other 行。这不完全是联合。

我会这样处理:

select a.column1, a.column2, 'a' as column3
from a
union all
select b.column1, b.column2, 'b' as column3
from b
where not exists (select 1 from a where a.column1 = b.column1);