2017-07-27 167 views
1

我想列出所有鏈接到一個特定的「互動」我希望員工與逗號分隔它們一個行中列出的員工,我有工作,但下面的查詢很慢。逗號串聯結果分隔列表

SELECT 
CONVERT(VARCHAR(254), 
    COALESCE(
     STUFF(
      (
       SELECT 
        ', ' + LTRIM(RTRIM(REPLACE(emp1.Full_Name,CHAR(9),''))) 
       FROM Employee emp1 WITH (nolock) 
       JOIN Rn_Int_Employee rie WITH (nolock) on emp1.Employee_Id = rie.Employee_Id 
       WHERE rnint.Rn_Interactions_Id = rie.Rn_Interactions_Id 
       GROUP BY emp1.Full_Name 
       ORDER BY emp1.Full_Name 
       FOR XML PATH (''),TYPE).value('text()[1]', 'nvarchar(max)'), 1, 2, '') 
     ,STUFF((
      SELECT 
       ', ' + LTRIM(RTRIM(REPLACE(emp1.Full_Name,CHAR(9),''))) 
      FROM Employee emp1 WITH (nolock) 
      WHERE rnint.Rn_Create_User=emp1.Rn_Employee_User_Id 
      GROUP BY emp1.Full_Name 
      ORDER BY emp1.Full_Name 
      FOR XML PATH (''),TYPE).value('text()[1]', 'nvarchar(max)'), 1, 2, ''))) 
     AS Employees  
FROM Rn_Interactions rnint 

有沒有人有這樣做的更有效的方式提出任何建議?

+0

你可能想嘗試codereview.stackexchange.com – JeffUK

+1

發佈你的表DDL(包括索引),並添加特定版本的SQL Server的標籤。 –

+1

高效?這是一個耗時的查詢嗎?瓶頸在哪裏(看執行計劃)? –

回答

0

我檢查了您的查詢,看到一些有趣的東西:

  • 您與FOR XML PATH抱怨結合使用STUFF作爲其中一個是慢執行
  • 你讓重複使用的NOLOCK提示
  • JOIN語法

我個人有非常不錯的表現串聯這些行與使用STUFFFOR XML PATH一個單細胞,你所做的一切,雖然您的最終問題是有可能可以使用一些幫助的結構。我敢打賭,你的索引不能達到標準,糾正這些會讓你感到非常滿意。

請分享你的執行計劃,以便我們可以指出那些出來給你;使用下面的太輕鬆分享計劃:https://www.brentozar.com/pastetheplan/

+0

謝謝 - 該計劃是在這裏:https://www.brentozar.com/pastetheplan/?id=SkhjeuPL- –

+0

你對'rnint.Rn_Interactions_Id'什麼指標? – Eli

+0

我在ID字段有一個聚集索引 –