Sql 对于此查询,“内部联接”或“何处”哪个是最好的
我有一个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 =
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编辑您的帖子,而不是在评论框中。