繁体   English   中英

T-SQL从一个表中选择列,其中另一个表中的id

[英]T-SQL Select columns from one table where id in another table

不久前 ,我问了这个问题: 在T_SQL的Taks记录中添加附件,并很好地回答了我的问题。

但是,我需要更进一步。 如果我有以下内容(基于上一个问题的答案)

SELECT TaskId, TaskDescription, TaskType 
FROM Tasks 
WHERE TaskType = 1 [FIRST-TABLE]

我希望能够然后选择

SELECT AttachmentId, TaskId, [FileName], FileLocation 
FROM TaskAttachments 
[WHERE TaskId IN FIRST-TABLE] ;

而且我需要能够将两个表都返回到asp.net

我可以编写一个查询来做到这一点:

SELECT AttachmentId, TaskId, [FileName], FileLocation 
FROM TaskAttachments 
WHERE TaskId EXISTS IN (SELECT TaskId, TaskDescription, TaskType 
                        FROM Tasks
                        WHERE TaskType = 1);

我的实际查询需要很多连接,因此需要更长的时间,因此第二个查询变得很长,而且看起来很复杂,需要两次选择相同的数据。

通过使用从第一个SELECT返回的实际数据,有没有比这更好的方法了?

(顺便说一句,请原谅任何语法错误。这只是为了快速说明,我的实际代码工作正常!!)

在这种情况下,您可以使用公用表表达式:

;with cte as(SELECT TaskId, TaskDescription, TaskType FROM Tasks)
SELECT AttachmentId, TaskId, [FileName], FileLocation 
FROM TaskAttachments where TaskID in(select TaskId from cte where TaskType = 1)

编辑:

IF EXISTS(SELECT * FROM tempdb.sys.tables WHERE [name] = '#tasks') BEGIN
   DROP TABLE #tasks;
END;

--save to temp table
SELECT TaskId, TaskDescription, TaskType into #tasks FROM Tasks

--select from temp table
SELECT TaskId, TaskDescription, TaskType FROM #tasks

--select from second table using temp table
SELECT AttachmentId, TaskId, [FileName], FileLocation 
FROM TaskAttachments where TaskID in(select TaskId from #tasks where TaskType = 1)

联接两个表也许不是使用EXISTS子句?

SELECT ta.AttachmentId, ta.TaskId, ta.FileName, ta.FileLocation 
FROM TaskAttachments ta INNER JOIN Tasks t ON ta.TaskId = t.TaskId 
WHERE t.TaskType = 1;

这将导致查询缩短。

SELECT AttachmentId, TaskAttachments.TaskId, [FileName], FileLocation    
  FROM TaskAttachments    
  JOIN Tasks 
    on TaskAttachments.TaskId = Tasks.TaskId    
   and Tasks.TaskType = 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM