我試圖從一個表中生成一個隨機值到針對另一個表寫入的查詢中。資料庫中有兩個表(資料庫名稱“TestDatabase”):a) [dbo].[Firstname_temp] - 包含一個名字串列(一個名為“Firstname”的列) b) [dbo].[Lastname_temp] - 包含一個姓氏串列(一列稱為“姓氏”)
我使用 Lastname_temp 表作為基礎,為查詢中的每個姓氏引入一個隨機名字。選擇 Lastname 表是因為與 Firstname 表(大約 5k)相比,它有更多的記錄(80K)。
我已經撰寫了以下查詢,但是它現在按預期作業,因為它為每個姓氏帶回了相同的隨機名字。
SELECT Lastname,
(select top 1 Firstname from [dbo].[Firstname_temp] order by newid()) as Firstname
FROM [TestDatabase].[dbo].[Lastname_temp]
我怎樣才能為每個姓氏行帶回一個隨機名字,而不是出現在他們身上的相同名字?
在此先感謝您的幫助。
uj5u.com熱心網友回復:
問題是NEWID()每個查詢只執行一次。沒有什么可以阻止 SQL Server 這樣做,因為子查詢不相關。要解決此問題,您可以關聯子查詢。
解釋:
NEWID()是一個奇怪的功能。盡管它是一個副作用函式,但 SQL Server 不保證它將為每個輸出行回傳一個新值,除非NEWID()呼叫直接在 mainSELECT中,或者它以某種方式與查詢的外部部分相關。
在您的查詢中,內部子查詢不相關,因此編譯器知道它可以將其從查詢的其余部分中提升出來。為防止這種情況,您可以通過放入冗余相關性來強制它在每個外部行上計算它。例如:
SELECT
Lastname,
(
select top (1)
Firstname
from [dbo].[Firstname_temp] f
where l.Lastname = l.Lastname ''
order by newid()
) as Firstname
FROM [TestDatabase].[dbo].[Lastname_temp] l
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/484685.html
上一篇:將資料聚合/組合在一起
下一篇:以分鐘為單位顯示時差
