1

我有 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

或者

t1    g2       
t2    g1

可以接受,但不能

t1    g1       
t2    g1

而不是两个结果集 - 我们只想要总共 2 行(在本例中)。

每个表的初始选择中可能有(比如说)30,000 行。不是所有的东西都会有匹配的,这很好。

这可以按设置完成还是我必须使用光标?

编辑以回应答案。

4

1 回答 1

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 )

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

于 2013-06-06T10:26:50.827 回答