为什么newid()在查询的最后实现?

时间:2011-06-30 21:20:19

标签: tsql sql-server-2008

如果在SQL Server中运行以下示例代码,您会注意到newid()在连接后实现,而row_number()在连接之前实现。有没有人理解这一点,是否有办法解决它?

declare @a table ( num varchar(10) )
 insert into @a values ('dan')
 insert into @a values ('dan')
 insert into @a values ('fran')
 insert into @a values ('fran')

 select *
   from @a T
            inner join
        (select num, newid() id
           from @a
          group by num) T1      on T1.num = T.num         

 select *
   from @a T
            inner join
        (select num, row_number() over (order by num) id
           from @a
          group by num) T1      on T1.num = T.num

2 个答案:

答案 0 :(得分:1)

我有类似的问题,发现“内部联接”是问题所在。我能够使用“左连接”......

答案 1 :(得分:0)

不确定我在这里看到了什么问题。首先实现子查询T1:

SELECT num, ROW_NUMBER() OVER (ORDER BY num) 
    FROM @a
    GROUP BY num;

你得到两行:

dan  1
fran 2

现在加入on num = num,你得到4行,每个不同的值为2。你的实际目标是什么?也许你应该在外面应用ROW_NUMBER()?

具体化的顺序取决于优化器。您会发现其他内置函数(RAND(),GETDATE()等)具有类似的不一致的实现行为。你无能为力,并没有太多机会他们去修复"它

修改

新代码示例。将@a的内容写入#temp表到"实现"每个唯一的num值的NEWID()赋值。

SELECT num, id = NEWID() 
  INTO #foo FROM @a GROUP BY num;

SELECT a.num, f.id 
  FROM @a AS a 
  INNER JOIN #foo AS f 
  ON a.num = f.num;

DROP TABLE #foo;