如果在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
答案 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;