2015-06-19 76 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 
相關問題