SQL联合两个表并将表名保留在列中

时间:2018-10-30 10:22:08

标签: sql sql-server union insert-into

我试图合并两个表,同时保留有关条目来自哪个表的信息。

例如,输入

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中插入不同的文本。表2

5 个答案:

答案 0 :(得分:2)

您想要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;

答案 1 :(得分:2)

您可以使用窗口功能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

答案 2 :(得分: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

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

  1. 从集合 A 中获取所有行,并添加值为A的列。
  2. 从集合 B 中获取所有不在集合 A 中的行,然后添加 列B的值。
  3. 返回步骤 1 2 的两个结果。

这就是此查询正在执行的操作。

答案 3 :(得分:1)

您可以尝试将UNIONtableA结合使用,然后将tableBouter join结合使用。

CASE WHEN

sqlfiddle

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

答案 4 :(得分:1)

您似乎想要来自private void Playing(object sender, EventArgs e) { int i= (int)((Button)sender).Tag; PlaySong(listBox1.Items[i].ToString()); } 的行,然后想要来自n.Click += (s, ev) => { //code when button clicked }; other 行。这不完全是一个联合。

我会这样处理:

a