我有两个表,其中包含一些唯一的和一些重复的条目。我需要UNION这些表并输出一个额外的列,它连接一个找到该行的tableidentifier。 请在此处找到示例:http://sqlfiddle.com/#!18/dc20c/6/0
我的输出应如下所示:
tablename || Column1 || Column2
AB Foo Bar
A Donut Onions
B Donut Pickles
遗憾的是,只需向union添加一列就会使行唯一,因此不会合并或连接。我如何实现这一目标?
答案 0 :(得分:3)
您可以汇总结果并计算tablename
...
http://sqlfiddle.com/#!18/dc20c/32
SELECT
MAX(CASE WHEN tablename = 'A' THEN 'A' ELSE '' END)
+ MAX(CASE WHEN tablename = 'B' THEN 'B' ELSE '' END)
+ MAX(CASE WHEN tablename = 'Z' THEN 'Z' ELSE '' END) AS tablename,
column1,
column2
FROM
(
SELECT
'A' AS tablename,
Column1,
Column2
FROM
TableFoo
UNION ALL
SELECT
'B' AS tablename,
Column1,
Column2
FROM
TableBar
)
TableFooBar
GROUP BY
column1,
column2
;
请注意,我还使用UNION ALL
代替UNION
。
UNION
有额外的开销用于删除重复项。这可能会以您不想要的方式影响您的结果,并且肯定会引入额外的处理成本。
UNION ALL
避免了这两种情况。
答案 1 :(得分:1)
答案 2 :(得分:0)
只需一个没有嵌套的联合就可以实现这一点。
SELECT
CASE WHEN (A.COLUMN1 IS NOT NULL AND A.COLUMN2 IS NOT NULL) THEN 'AB' ELSE 'A' END AS tablename,
B.Column1,
B.Column2
FROM
TableFoo B
LEFT OUTER JOIN TABLEBAR A ON A.COLUMN1=B.COLUMN1 AND A.COLUMN2=B.COLUMN2
UNION
SELECT
'B' tablename,
B.Column1,
B.Column2
FROM
TableBar B
LEFT OUTER JOIN TABLEFOO A ON A.COLUMN1=B.COLUMN1 AND A.COLUMN2=B.COLUMN2
WHERE (A.COLUMN1 IS NULL AND A.COLUMN2 IS NULL)