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
这样的事情可能是您寻求的解决方案。
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
我很奇怪它不起作用。您的要求可以翻译为:
- 从集合 A 中取出所有行并添加值为 A 的列。
- 从集合 B 中取出所有不在集合 A 中的行,然后添加
值为 B 的列。
- Return 都是步骤 1 和 2.
的结果
这就是这个查询正在做的事情。
您可以尝试使用 UNION
结合 tableA
和 tableB
然后使用 outer join
和 CASE 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
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);
我正在尝试联合两个 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
这样的事情可能是您寻求的解决方案。
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
我很奇怪它不起作用。您的要求可以翻译为:
- 从集合 A 中取出所有行并添加值为 A 的列。
- 从集合 B 中取出所有不在集合 A 中的行,然后添加 值为 B 的列。
- Return 都是步骤 1 和 2. 的结果
这就是这个查询正在做的事情。
您可以尝试使用 UNION
结合 tableA
和 tableB
然后使用 outer join
和 CASE 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
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);