Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 对于此查询,“内部联接”或“何处”哪个是最好的_Sql_Tsql_Optimization - Fatal编程技术网

Sql 对于此查询,“内部联接”或“何处”哪个是最好的

Sql 对于此查询,“内部联接”或“何处”哪个是最好的,sql,tsql,optimization,Sql,Tsql,Optimization,我有一个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 =

我有一个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时,需要花费很多时间

e、 g.123[strIDS中的最后一个id]是来自CRSTask的taskID,ont与CRSTaskReceiver之间有一个关系 taskReceiver与门户\用户\视图ID、用户名有一对一的关系 -我需要用它的等效用户名替换123
-我是用Joins做的。。这需要很多时间,使用Where-between-tables也需要很多时间来回答您的问题:在我看来,连接在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:演员阵容真的有必要吗?我假设所有id字段都存储为int?!?如果是这样,并且有了正确的索引,这些连接应该“非常快”,但是有了强制转换,服务器无法正确使用其索引,并且您可能会有最奇怪的行为性能。

您需要向我们展示您修改后的查询。以及您试图加入的表的结构。选择t.id作为taskid,选择',“+x.ArabicName FROM SELECT ArabicName FROM Portal_Users_View,其中ID IN SELECT crs taskReceiver.ReceiverID FROM crs taskReceiver,其中crs taskReceiver.crs taskId IN/*305*/选择CASTid AS VARCHAR200 AS tid FROM crs task c,其中c.ParentTask=7562 x表示XML路径1,1,作为CRSTask t的strid,其中t.ParentTask为NULL,t.id=7562编辑您的帖子,而不是在评论框中。