【问题标题】:SQL Server : compare two tables and return similar rowsSQL Server:比较两个表并返回相似的行
【发布时间】:2015-08-02 05:53:08
【问题描述】:

我想比较两个表,源和目标,并得到相似的行。

一一比较Id上的源和目标,然后:

  • 如果匹配并且目标上有两个或更多 => 从目标中选择所有匹配
    • 如果匹配并且在 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')

【问题讨论】:

  • 考虑到没有ORDER BY 子句就没有定义行顺序,“第一次匹配”是什么意思?同样,鉴于行未按任何定义的顺序过滤,“之前未选择”是什么意思?
  • 嗨,约翰,请注意。声明声明性语言是错误的!我会更新帖子。

标签: sql sql-server compare


【解决方案1】:

我认为您只需要Exists 操作员就可以做到这一点。

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

SQLFIDDLE DEMO

【讨论】:

  • 我试过加入,但这个更快。我已经看到了 Join 和 Exists 两者的执行计划。投票赞成。
  • @MihirShah - 只有当我需要从两个表中选择数据时,我才会选择Join。如果您只想检查是否存在,请始终选择Exists
【解决方案2】:
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)

【讨论】:

  • 你真的需要那个where子句
  • WHERE 子句绝对没用。它永远不会过滤掉任何行,因为连接条件已经确保每一行都满足它。
  • 无论如何,这并不能根据匹配的源行和目标行的数量来解决请求的不同结果。
  • 是的,你是对的,这里不需要 Where 子句……我的错误
猜你喜欢
  • 1970-01-01
  • 2019-06-17
  • 2021-07-26
  • 2011-12-21
  • 1970-01-01
  • 2011-04-11
  • 2012-08-01
  • 1970-01-01
  • 2021-03-04
相关资源
最近更新 更多