我有 3 個表(Contact、ContactBridge、ContactLabel)。
ContactLabel 表具有與聯系人關聯的所有標簽名稱(可以是 1 個標簽,可以是 50 個標簽)。要訪問它們,我必須通過存盤 LabelId 的 ContactBridge 表。
目標是為每個聯系人檢索一行中的所有標簽名稱。
我能夠弄清楚查詢,但是它執行時間超長(約 1000 條記錄需要將近 2 分鐘)。
declare @Contact table
(ContactId INT, ContactName VARCHAR(100))
INSERT INTO @Contact
VALUES
(78561, 'Tom Cruise'),
(54721, 'Iron Man')
declare @ContactBridge table
(BridgeId INT, ContactId INT, LabelId INT)
INSERT INTO @ContactBridge
VALUES
(1, 78561, 12),
(2, 54721, 34),
(3, 78561, 23),
(4, 54721, 67),
(5, 54721, 78),
(6, 78561, 34),
(7, 78561, 45),
(8, 54721, 56)
declare @ContactLabel table
(LabelId INT, LabelName VARCHAR(100))
INSERT INTO @ContactLabel
VALUES
(12, 'Actor'),
(23, 'Los Angeles'),
(34, 'Rich'),
(45, 'Married'),
(56, 'Single'),
(67, 'New York'),
(78, 'Superhero')
SELECT * FROM @Contact as c
--- Contact Labels in 1 single row
OUTER APPLY (
SELECT STUFF((
(SELECT ', ' labels.LabelName
FROM @ContactBridge AS bridge
JOIN @ContactLabel AS labels
ON labels.LabelId = bridge.LabelId
WHERE bridge.ContactId = c.ContactId
FOR XML PATH(''), TYPE).value('.', 'varchar(max)')),1,1,''
) AS ContactLabels
) AS cl
有沒有辦法讓查詢運行得更快?
uj5u.com熱心網友回復:
使用string_agg如下
SELECT C.ContactId,ContactName,
string_agg(LabelName,',') AS ContactLabels
FROM @Contact C
JOIN @ContactBridge CB ON CB.ContactId = C.ContactId
JOIN @ContactLabel CL ON CL.LabelId = CB.LabelId
GROUP BY c.ContactId,ContactName
ORDER BY ContactName DESC, string_agg(LabelName,',') ASC
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/428140.html
