2013-02-15 108 views
0

我想在我的一個查詢中插入一個條件,但不知道如何去做。 基本上,我正在通過文件夾_id對它們進行排序,即它們屬於的文件夾(使用folder_id的順序)。我現在想要的是,對於這些文件組中的每一個,都是查詢選擇滿足特定條件的第一個文件。如果該條件未被文件夾中的任何文件滿足,則查詢應該選取該文件夾中可用的第一個文檔。如果在WHERE子句中存在EXISTS?

這是我的查詢(簡體):

select folder_id, 
     file_id, 
     first_name 
from f_file 
where first_name = 'John' 
order by folder_id 

所以,如果我現在的結果:

FOLDER ID FILE ID  AUTHOR 
A   32   John 
A   41   John 
A   56   Thomas 
A   78   Peter 
B   02   Peter 
B   03   Peter 
B   45   Peter 
C   34   John 
C   56   Thomas 
C   77   Peter 
C   86   John 
D   12   Peter 
D   34   Thomas 
D   89   Thomas 

爲每個文件夾,我想查詢只顯示第一個文件(最低的file_id)是由John創建的。如果在該文件夾中根本沒有John創建的文檔,則比任何其他作者的第一個文檔都要做的更好。

FOLDER ID FILE ID  AUTHOR 
A   32   John 
B   02   Peter 
C   34   John 
D   12   Peter 

所以,ID必須是最低的,但作者必須是約翰或另一個。 我的想法是在WHERE條款中插入一個IF EXISTS子句,但該怎麼做?

感謝您的回覆。 瓦爾

+1

你應該在你的樣本數據和期望的結果,其中約翰只是沒有方便碰巧也有最低的file_id顯示的例子。 – 2013-02-15 16:02:38

+0

對於文件夾B和D,John沒有最低的file_id,所以Peter的第一個文檔正在顯示。 – 2013-02-18 10:15:35

+0

我想你錯過了我的觀點。對於B和D,John根本沒有文件。你看到一個潛在的用例(可以說是最重要的用例)是如何失蹤的?將John添加到其中一個集合中,使用更高的file_id。您的樣本數據需要顯示我們如何真正解決問題。這就像要求交易的代碼一樣,閏年只有2007年4月的樣本數據。 – 2013-02-18 16:36:10

回答

-1

嘗試:

;WITH x AS 
(SELECT folder_id, file_id, author, 
     rn = ROW_NUMBER() OVER (PARTITION BY folder_id 
           ORDER BY case author when 'John' then 1 else 2 end, 
              file_id) 
    FROM f_file 
) 
SELECT folder_id, file_id, author 
FROM x WHERE rn = 1 
ORDER BY folder_id; 
+0

請問downvoter可以爲downvote留下一個解釋嗎? – 2013-02-17 07:09:47