我有2个表,称之为G和T,我根据多个字段的匹配选择记录。
SELECT
g.ID, t.ID
FROM
g JOIN t
ON (g.Field1 = t.Field1
AND g.Field2 = t.Field2
AND .... )
可以有多个记录匹配每一方,例如行t1和t2在用于匹配的字段上是相同的,g1和g2也是相同的,它们相互匹配,给出了
t1 g1
t1 g2
t2 g1
t2 g2
(实际的ID是整数,但你明白了)
我们想要的是每个T记录只匹配一个G记录(我们不关心哪个只要它们是不同的记录),例如
t1 g1
t2 g2
OR
t1 g2
t2 g1
是可以接受的,但不是
t1 g1
t2 g1
而不是两个结果集 - 我们只想要总共2行(在本例中)。
每张表的初始选择中可能有(例如)30,000行。并非一切都有匹配,这很好。
这可以按顺序完成还是必须使用光标?
回复时回复。
答案 0 :(得分:2)
您可以使用ROW_NUMBER()
指定一些任意标识符来进行匹配:
;With TOrdered as (
select ID,Field1,Field2,
ROW_NUMBER() OVER (PARTITION BY Field1,Field2 ORDER BY ID) as rn
from T
), GOrdered as (
select ID,Field1,Field2,
ROW_NUMBER() OVER (PARTITION BY Field1,Field2 ORDER BY ID) as rn
from G
)
SELECT
g.ID, t.ID
FROM
GOrdered g
JOIN
TOrdered t
ON (g.Field1 = t.Field1
AND g.Field2 = t.Field2
AND g.rn = t.rn )
(如果两个表之间的计数不匹配,最终结果中根本不会显示某些行 - 但是您还没有真正指出它们是否应该被处理,或者它们应该如何处理)