2010-01-27 5 views
0

J'ai cette requête SQLQuel est le meilleur pour cette requête, « jointure » ou « Où »

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 

le résultat de cette requête sera:

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

Ce qui est bon, mais quand j'ai essayé de remplacer le strIDS avec ses noms d'une autre table, il prend beaucoup de temps.

par exemple. 123 [dernier id dans strIDS] est un taskID de CRSTask, a une relation ont-à-un à CRSTaskReceiver et taskReceiver a une relation un-à-un à Portal_Users_View (id, nom d'utilisateur) -I nécessité de remplacer 123 avec son équivalent userName -J'ai fait en utilisant Joins .. cela prend beaucoup de temps, aussi en utilisant Où entre les tables prennent beaucoup de temps

+0

Vous devez nous montrer votre requête modifiée. Et la structure des tables que vous essayez de rejoindre. – Oded

+0

ok Oded, attendez une minute – RMohammed

+0

SELECT t.id AS taskid, STUFF ((SELECT '' + x.ArabicName DE (SELECT DE Portal_Users_View noms de personnes en arabe WHERE ID IN (SELECT CRSTaskReceiver.ReceiverID DE CRSTaskReceiver OÙ CRSTaskReceiver. CRSTaskID IN/* 305 */ (SELECT CAST (id AS VARCHAR (200)) AS tid dE CRSTask c OÙ c.ParentTask = 7562 )) ) x POUR XML PATH ('') ), 1, 1, '' ) AS strIDS à partir de RSTask t O WH t.ParentTask EST NULL AND t.id = 7562 – RMohammed

Répondre

0

Pour répondre à votre question: à mon avis, les JOIN sont meilleurs dans 99% des cas comme ils montrent plus clairement le modèle de données sous-jacent. Cela facilite la maintenance du code ET l'optimiseur de requêtes dispose également d'un délai plus court pour élaborer un plan de requête décent.

Je ne suis pas un grand fan de UDF, mais dans ce cas, il est peut-être la meilleure façon de résoudre votre problème d'agrégation est une chaîne non prise en charge nativement par 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: I essayé d'interpréter votre code de données à partir du code ci-dessus, vous aurez besoin de vérifier à nouveau si!

PS: est Cast() vraiment nécessaire? Je suppose que tous les champs id sont stockés sous int?!? Si oui (et avec les index droit) devraient être ces jointures « extrêmement rapide », mais avec les acteurs() là-bas le serveur ne peut pas utiliser ses index correctement et vous pourriez avoir la performance sage comportement le plus bizarre.

Questions connexes