我想從同一條記錄回傳多個值,并將相同型別的不同列附加在另一個列下。我可以進行多個連接,但由于多個表掃描,這似乎非常低效。
declare @gameID as VarChar(30)
select @gameID = '20210829-SLNvsPIT-0'
select Vis1ID as VisID, Vis1 as Vis, Home1 as Home, Home1ID as HomeID
from Baseball.dbo.GameLogs
where GameID = @gameID
union
select Vis2ID, Vis2, Home2, Home2ID
from Baseball.dbo.GameLogs
where GameID = @gameID
union
.......
select Vis9ID, Vis9, Home9, Home9ID
from Baseball.dbo.GameLogs
where GameID = @gameID
回傳:
| 可視ID | 可見光 | 家 | 家庭ID |
|---|---|---|---|
| arenn001 | 諾蘭·阿雷納多 | 科林·莫蘭 | 莫拉克001 |
| badeh001 | 哈里森·巴德 | 安東尼·奧爾福德 | 阿爾法002 |
| 卡號002 | 迪倫卡爾森 | 辻義 | tsuty001 |
| edmat001 | 湯米埃德曼 | 凱文紐曼 | newmk001 |
| 金p001 | 保羅·戈德施密特 | 科布萊恩·海斯 | 海耶克001 |
| 金-k001 | 金光 | 威爾克勞 | 烏鴉001 |
| moliy001 | 亞迪爾·莫利納 | 雅各布·斯托林斯 | stalj001 |
| oneit001 | 泰勒奧尼爾 | 布萊恩雷諾茲 | reynb001 |
| sosae001 | 埃德蒙多·索薩 | 科爾·塔克 | tuckc001 |
這正是我正在尋找的,但它非常緩慢。有沒有更好的辦法?
uj5u.com熱心網友回復:
您需要取消旋轉每一行。這意味著您只掃描表一次,然后將其分成單獨的行。您可以使用UNPIVOT,但CROSS APPLY (VALUES要靈活得多。
DECLARE @gameID varchar(30) = '20210829-SLNvsPIT-0';
SELECT
v.VisID,
v.Vis,
v.Home,
v.HomeID
FROM dbo.GameLogs gl
CROSS APPLY (VALUES
(Vis1ID, Vis1, Home1, Home1ID),
(Vis2ID, Vis2, Home2, Home2ID),
(Vis3ID, Vis3, Home3, Home3ID),
(Vis4ID, Vis4, Home4, Home4ID) -- .....
) v(VisID, Vis, Home, HomeID)
WHERE gl.GameID = @gameID;
不用說,您的表已嚴重非規范化,應該立即重新設計。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/402686.html
標籤:
上一篇:在Rider/AzureDataStudio中查找DB的連接字串。查詢陳述句
下一篇:HTML面試題整理
