如何返回具有连接标识符的列

时间:2018-02-01 13:34:39

标签: sql-server sql-server-2012 union

我有两个表,其中包含一些唯一的和一些重复的条目。我需要UNION这些表并输出一个额外的列,它连接一个找到该行的tableidentifier。 请在此处找到示例:http://sqlfiddle.com/#!18/dc20c/6/0

我的输出应如下所示:

tablename || Column1 || Column2
AB           Foo        Bar
A            Donut      Onions
B            Donut      Pickles

遗憾的是,只需向union添加一列就会使行唯一,因此不会合并或连接。我如何实现这一目标?

3 个答案:

答案 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)

试试这个

setDataSource()

检查Fiddle

答案 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)