2010-01-27 64 views
0

我有這樣的SQL查詢哪一個是最適合這種查詢,「內連接」或「去哪兒」

SELECT t.id AS taskid, 
     STUFF(
      (
       SELECT ',' + x.tID 
       FROM (
          SELECT CAST(id AS VARCHAR(200)) AS tid 
          FROM CRSTask c WHERE c.ParentTask = 
          7562 -- comment this line 
        ) x 
         FOR XML PATH('') 
      ), 
      1, 
      1, 
      '' 
     ) AS strIDS 
FROM CRSTask t 
WHERE t.ParentTask IS NULL 
AND t.id = 7562 -- comment this line 

此查詢的結果將是:

id   strIDS 
7562 7615,7616,7617,7618,7619,7620,7621,7631,7632,123 

這是好事,但是當我嘗試用另一個表中的名稱替換strIDS時,它需要很長時間。

例如123 [strIDS中的最後一個id]是來自CRSTask的任務ID,與CRSTaskReceiver 有一對一的關係,taskReceiver與Portal_Users_View(id,userName)有一對一的關係 - 我需要用123代替它的等價用戶名 - 我使用連接..它需要很多時間,也使用表之間的地方需要很多時間

+0

您需要向我們顯示您的修改後的查詢。以及您嘗試加入的表格的結構。 – Oded 2010-01-27 08:22:09

+0

OK烏迪德,等待一分鐘 – RMohammed 2010-01-27 08:27:27

+0

SELECT t.id AS的taskid,STUFF((SELECT '' + x.ArabicName FROM(SELECT阿拉伯人名 FROM Portal_Users_View WHERE ID IN(SELECT CRSTaskReceiver.ReceiverID FROM CRSTaskReceiver WHERE CRSTaskReceiver。 CRSTaskID IN/* 305 */ (選擇C CAST(ID作爲VARCHAR(200))AS TID FROM CRSTask WHERE c.ParentTask = 7562 )) )× FOR XML PATH( '') ) 1, 1, '' )AS strIDS FROM C RSTask t WHERE t.ParentTask IS NULL AND t.id = 7562 – RMohammed 2010-01-27 08:34:58

回答

0

要回答你的問題:在我看來,JOINs在99%的情況下更好作爲他們更清楚地展示了基礎數據模型。這樣可以更容易地維護代碼,並且查詢優化器也可以更容易地提出一個體面的查詢計劃。

我不是UDF的一個大風扇,但在這種情況下,聚集的字符串是不是原生支持MSSQL可能是爲您解決問題最簡單的方法:

-- create User Defined Function to fetch list of names for given taskid 
CREATE FUNCTION dbo.fn_names_from_taskid (@taskid int) 
RETURNS nvarchar(max) 
AS 
    BEGIN 
     DECLARE @result nvarchar(max) 
     SELECT @result = '' 

     SELECT @result = @result 
         + Portal_Users_View.ArabicName + ',' 
      FROM Portal_Users_View 
      JOIN CRSTaskReceiver 
      ON CRSTaskReceiver.ReceiverID = Portal_Users_View.ID 
      JOIN CRSTask c 
      ON CAST(c.id AS VARCHAR(200)) = CRSTaskReceiver.CRSTaskID -- cast really necessary? 
      AND c.ParentTask = @taskid 

     -- strip last comma (if present) 
     SELECT @result = (CASE WHEN Right(@result, 1) = ',' THEN Left(@result, Len(@result) - 1) ELSE @result END) 

     Return(@result) 
    END 

GO 

-- usage  
SELECT taskid = t.id, 
     nameslist = dbo.fn_names_from_taskid (t.id) 
    INTO #test 
WHERE id = 7652 

PS:我試圖從上面的代碼解釋你的數據模型,你需要仔細檢查它!

PS:是Cast()真的有必要嗎?我會假設所有的id字段被存儲爲int?!?如果是這樣(並且使用正確的索引),那些連接應該是'非常快',但是在那裏有Cast(),服務器不能正確使用它的索引,並且你可能會在性能方面有最奇怪的行爲。