2015-06-19 78 views
0

我问了一些回头的问题:Adding attachments to taks records in T_SQL 并得到了我的问题的完美答案。T-SQL从一个表中选择列在其他表中的ID

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

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); 

我的实际查询是更长的时间与LO因此这个第二个查询变得很长,这看起来很复杂,需要两次选择相同的数据。

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

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

回答

0

您可以在此情况下使用公用表表达式:

;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) 
+0

感谢您的支持。但是,它似乎只返回一个结果集。我错过了什么吗?我需要将Task和TaskAttachments中的结果集作为两个单独的表返回。 – grayson

+0

这是什么意思?如果你想要2个独立的表,然后写2个单独的语句 –

+0

@格雷森,我想我得到你。查看修改。 –

0

加入两个表可能而不是使用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; 

这会导致查询变短。

0
SELECT AttachmentId, TaskAttachments.TaskId, [FileName], FileLocation  
    FROM TaskAttachments  
    JOIN Tasks 
    on TaskAttachments.TaskId = Tasks.TaskId  
    and Tasks.TaskType = 1 
相关问题