Sql 选择除一列之外的联合

Sql 选择除一列之外的联合,sql,sql-server-2008,union,Sql,Sql Server 2008,Union,我有一个问题: 我想使用UNION将两个SQL查询连接到一个查询中以避免重复,但我需要知道数据是来自第一个select查询还是来自第二个select查询 样本数据: A TABLE B TABLE ----------------------------------------------------------------------------- 01 JOHN

我有一个问题:

我想使用UNION将两个SQL查询连接到一个查询中以避免重复,但我需要知道数据是来自第一个select查询还是来自第二个select查询

样本数据:

 A TABLE                                                B TABLE
-----------------------------------------------------------------------------
01 JOHN                                                01 JOHN
02 JUAN                                                02 PETER
03 MARTIN                                              03 MARTIN
我有这样的想法:

Select A.code,A.name from A where some conditions
unión
Select B.code,B.name from B where diferent conditions
Select A.code,A.name, 'A'   from A where some conditions
unión
Select B.code,B.name, 'B'   from B where diferent conditions
结果表


这很好,但是现在如果我想知道数据是来自第一个查询还是第二个查询,我会这样想:

Select A.code,A.name from A where some conditions
unión
Select B.code,B.name from B where diferent conditions
Select A.code,A.name, 'A'   from A where some conditions
unión
Select B.code,B.name, 'B'   from B where diferent conditions
结果表


但不要避免“重复”,因为“A”与“B”不同,所以问题是,我能做些什么,使他们不会将“A”与“B”进行比较吗?这是获得预期结果的另一种方法吗

编辑:

预期结果


您可以尝试以下方法:

Select A.code, A.name, 'A' col_name  from A where some conditions
UNION ALL
Select B.code, B.name, 'B'   from B where different conditions
Union将删除重复项,而Union All将不删除

编辑:

SELECT *
FROM
(
SELECT DISTINCT A.code, A.name From A WHERE some conditions
UNION
SELECT DISTINCT B.code, B.name From B WHERE different conditions
) t

像以前一样执行
联合
,但不要返回已经从A select返回的B行。

下面是另一种方法:

SELECT code, name, MIN(SourceTable) AS SourceTable
FROM (
  SELECT code, name, 'A' AS SourceTable         
  FROM A

  UNION 

  SELECT code, name, 'B' AS SourceTable         
  FROM B) t
GROUP BY code, name 
ORDER BY code

或许:

SELECT code, name, SourceTable
FROM (
  SELECT code, name, SourceTable,
         ROW_NUMBER() OVER (PARTITION BY code, name 
                            ORDER BY SourceTable) AS rn
  FROM (
    SELECT code, name, 'A' AS SourceTable         
    FROM A

    UNION ALL

    SELECT code, name, 'B' AS SourceTable         
    FROM B) t) AS x
WHERE x.rn = 1  

当约翰同时在A和B两个位置时会发生什么?查询只告诉你它在A中可以吗?是的,对我来说很好,它只在A中,这正是我所期望的,我编辑以查看我所期望的结果,然后jarlh的答案应该会起作用。这不是他所需要的相反吗?@MihaiOvidiuDrăgoi:-我认为OP想要保留副本,这就是我建议这样做的原因。请参见这一行
,但不要避免“重复”
我同意Mihai Ovidiu Drăgoi-我认为这个问题相当于“如何仅使用行的一部分?”?“感谢您的回答,我需要或期望的是,在重复的情况下,它只保留一个重复的行,我编辑以查看我需要的内容expect@Ion:-你可以查看答案!这正是你需要的谢谢,很好,因为我把@Giorgos Betsos选为正确答案,因为他的表现更好。总之,我更容易理解你的答案为什么有效
SELECT code, name, MIN(SourceTable) AS SourceTable
FROM (
  SELECT code, name, 'A' AS SourceTable         
  FROM A

  UNION 

  SELECT code, name, 'B' AS SourceTable         
  FROM B) t
GROUP BY code, name 
ORDER BY code
SELECT code, name, SourceTable
FROM (
  SELECT code, name, SourceTable,
         ROW_NUMBER() OVER (PARTITION BY code, name 
                            ORDER BY SourceTable) AS rn
  FROM (
    SELECT code, name, 'A' AS SourceTable         
    FROM A

    UNION ALL

    SELECT code, name, 'B' AS SourceTable         
    FROM B) t) AS x
WHERE x.rn = 1