【发布时间】: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