gpt4 book ai didi

sql - 为什么左连接会导致 NEWID() 比连接更早实现?

转载 作者:行者123 更新时间:2023-12-03 00:46:48 26 4
gpt4 key购买 nike

使用 MSSQL Server 2008 Enterprise Edition,以及很可能的其他版本的 MSSQL,这里是一个概念证明,它根据您使用的是 JOIN 还是 LEFT JOIN 来创建临时表并具体化 NEWID(),即使我们是完全匹配两行。

如果查看执行计划,您可以看到获取 NEWID() 的计算标量是最后使用 JOIN 执行的,但在使用 LEFT JOIN 时则不是。我本来期望 LEFT JOIN 行为。这种奇怪的现象是由于执行计划中的幼稚造成的还是还有其他原因?

使用临时表进行演示:

Create Table #Temp
(
ChildGuid uniqueidentifier,
ParentGuid uniqueidentifier
)
insert into #Temp (ChildGuid, ParentGuid) Values('5E3211E8-D382-4775-8F96-041BF419E70F', '96031FA0-829F-43A1-B5A6-108362A37701')
insert into #Temp (ChildGuid, ParentGuid) Values('FFFFFFFF-D382-4775-8F96-041BF419E70F', '96031FA0-829F-43A1-B5A6-108362A37701')

--Use a join. Get different NewIDs.
select * from #Temp
join
(
select ParentGuid, NewParentGuid from(
select ParentGuid, NEWID() as NewParentGuid from #Temp
group by ParentGuid
) tb2
) temp2 on #Temp.ParentGuid = temp2.ParentGuid

--Do exactly as above, but use a left join. Get a pair of the same NewIDs.
select * from #Temp
left join
(
select ParentGuid, NewParentGuid from(
select ParentGuid, NEWID() as NewParentGuid from #Temp
group by ParentGuid
) tb2
) temp2 on #Temp.ParentGuid = temp2.ParentGuid

使用 Join 时,两行的 NewParentGuid 都不同。

对于 Left Join,NewParentGuid 是相同的。

编辑2:如果将其附加到左连接,结果会发生变化。

where temp2.ParentGuid = temp2.ParentGuid

或者正如另一位用户指出的那样,该列不为空。在其他列或 1=1 的情况下进行比较时,它们将保持不变。薛定谔的列?

另请参阅:

Why does newid() materialize at the very end of a query?

最佳答案

这并不是真正的答案,而是观察

这将返回重复的内容

select * from #Temp 
inner hash join
(
select ParentGuid, NEWID() as NewParentGuid
from #Temp
group by ParentGuid
union
select null, NEWID()
) temp2
on #Temp.ParentGuid = temp2.ParentGuid

--Do exactly as above, but use a left join. Get a pair of the same NewIDs.
select * from #Temp
left hash join
(
select ParentGuid, NEWID() as NewParentGuid
from #Temp
group by ParentGuid
) temp2
on #Temp.ParentGuid = temp2.ParentGuid

这迫使它们变得不同

select * from #Temp  join  (
select ParentGuid, NEWID() as NewParentGuid
from #Temp
group by ParentGuid ) temp2
on #Temp.ParentGuid = temp2.ParentGuid

--Do exactly as above, but use a left join. Get a pair of the same NewIDs. select * from #Temp left join (
select ParentGuid, NEWID() as NewParentGuid
from #Temp
group by ParentGuid ) temp2
on #Temp.ParentGuid = temp2.ParentGuid
and temp2.ParentGuid is not null

关于sql - 为什么左连接会导致 NEWID() 比连接更早实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26045081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com