如何根据2个表获取唯一记录?

时间:2015-08-21 09:31:35

标签: sql-server sql-server-2012

您好我对sql server

有疑问
Table : emp 

    Id  |  Desc
    1   |  abc
    2   |  def
    3   | har

table2:emp1

Id | Desc
3  | Har
4  | jai
4  | jai
5  | uou
6  | uni
6  | udkey
2  | Jainiu

基于上表我想要输出如下

 ID   | Desc
 1    | abc
 2    | def
 3    | har
 4    | jai
 5    | uou
 6    | uni

我试过以下

select  id, desc from emp
 union 
 select * from (select *,row_number()over(partition by id)as rn from emp1)
where rn=1

执行此查询后,我收到如下错误

  

Msg 205,Level 16,State 1,Line 2
  使用UNION,INTERSECT或EXCEPT运算符组合的所有查询在目标列表中必须具有相同数量的表达式。

上面说的第一个查询是2列,2个查询是3列,这个过程 我们如何避免这个列。 请告诉我如何在sql server

中编写查询以执行此任务

2 个答案:

答案 0 :(得分:1)

使用:

SELECT id, 
       desc 
FROM   emp 
UNION 
SELECT id, 
       desc 
FROM   emp1 

Union将按正确顺序自动执行distinctsort,您无需执行任何操作,无需防风功能

结果:

 ID   | Desc
 1    | abc
 2    | def
 2    | Jainiu
 3    | har
 4    | jai
 5    | uou
 6    | uni
 6    | udkey

如果您要删除udkeyJainiu,请在defJainiu之间选择一个logi,等等......

答案 1 :(得分:0)

使用Union或Distinct我们可以重新复制和row_number我们可以得到输出和In union应该有相同数量的列     DECLARE @emp TABLE         ([Id] int,[var] varchar(3))     ;

INSERT INTO @emp
    ([Id], [Desc])
VALUES
    (1, 'abc'),
    (2, 'def'),
    (3, 'har')


DECLARE @emp1  TABLE 

    ([Id] int, [Desc] varchar(6))


INSERT INTO @emp1
    ([Id], [Desc])
VALUES
    (3, 'Har'),
    (4, 'jai'),
    (4, 'jai'),
    (5, 'uou'),
    (6, 'uni'),
    (6, 'udkey'),
    (2, 'Jainiu')


    ;with CTE AS (

      select 
id,
[Desc],
Row_NUMBER()OVER(PARTITION BY ID ORDER BY ID,[Desc]DESC)RN 
         from 

      (select distinct id,[Desc] from @EMP
    UNION ALL 
    select distinct id,[Desc] from @EMP1)T)

    select id,[Desc] from CTE 
    WHERE RN = 1