匹配行:我需要游标吗? (SQL Server 2005)

时间:2013-06-06 10:13:38

标签: sql sql-server-2005 cursor set grouping

我有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行。并非一切都有匹配,这很好。

这可以按顺序完成还是必须使用光标?

回复时回复。

1 个答案:

答案 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 )

(如果两个表之间的计数不匹配,最终结果中根本不会显示某些行 - 但是您还没有真正指出它们是否应该被处理,或者它们应该如何处理)