SQL Server:比较两个表并返回类似的行

时间:2015-08-02 05:53:08

标签: sql sql-server compare

我想比较两个表,source和target,并得到类似的行。

逐一比较Id上的来源和目标:

  • 如果匹配且在Target =>上有两个或更多个选择所有匹配目标
    • 如果匹配且在Source =>上有两个或更多个
    • 如果之前没有选择,则首先匹配
      • 选择匹配目标
    • else(如果它之前已选择)
      • 检查下一个匹配的

我认为需要一个递归表达式来逐一检查源和目标

来源

x------x---------x
|  Id  |   Name  |
x------x---------x
|   1  |   a     |
|   2  |   b     |
|   2  |   c     |
|   3  |   d     |
|   3  |   e     |
|   4  |   x     |
x------x---------x

目标

x------x---------x
|  Id  |   Name  |
x------x---------x
|   1  |   f     |
|   1  |   g     |
|   2  |   h     |
|   3  |   i     |
|   3  |   j     |
|   5  |   y     |
x------x---------x

结果

x------x---------x
|  Id  |   Name  |
x------x---------x
|   1  |   f     |
|   1  |   g     |
|   2  |   h     |
|   3  |   i     |
|   3  |   j     |
x------x---------x

测试数据

declare @s table(Id int, name varchar(20))
DECLARE @t table( Id int, name varchar(20))

INSERT @s values(1, 'a'), (2, 'b'), (2, 'c'), (3, 'd'), (3, 'e')

INSERT @t values(1, 'f'), (1, 'g'), (2, 'h'), (3, 'i'), (3, 'j')

2 个答案:

答案 0 :(得分:2)

我认为您只需要Exists运算符即可。

select * from @t t
where exists (select 1 from @s s where t.id=s.id)

<强> SQLFIDDLE DEMO

答案 1 :(得分:-1)

SELECT DISTINCT 
    t.Id,
    t.name
FROM SOURCE s
INNER JOIN target t ON s.id=t.Id
WHERE s.Id IN (SELECT Id FROM target)