2016-07-30 98 views
0

我有這個問題。讓我們看看查詢:針對主詳細查詢結果的SQL Server條件查詢

SELECT 
    D.DocumentName, 
    D.Title, 
    D.Description, 
    V.Version, 
    CASE 
     WHEN V.State = 'PUB' THEN 'PUBLISHED' 
     WHEN V.State = 'UNP' THEN 'UNPUBLISHED' 
     WHEN V.State IS NULL THEN 'NOT PUBLISHED' 
     ELSE '' 
    END AS State 
FROM 
    Document D 
LEFT JOIN 
    DocumentVersion V ON D.IdDocument = V.IdDocumentVersion 

這是一個典型的主 - 細節表(Document-DocumentVersion)。 A Document可以有一個或多個DocumentVersions或沒有。 A DocumentVersion狀態可以是PUBLISHEDUNPUBLISHEDPUBLISHED一個DocumentVersion只能存在一次Document(這是由應用程序控制),但可以存在很多UNPUBLISHED,或者所有DocumentVersions都是UNPUBLISHED。 NOT PUBLISHED不存在,當Document沒有DocumentVersion記錄時,這只是查詢結果中的一個單詞,這就是LEFT JOIN的原因。

所以我的問題是:我如何使查詢完成下一個規則?

  • 如果DocumentVersion狀態PUB,忽略了別人,我的意思是不顯示UNP那些在查詢結果用於本Document

  • 如果DocumentVersion狀態UNP(這裏可許多UNP),那麼只顯示最高日期爲UnpublishDocumentVersion表格有UnPublishDate列),此規則適用於沒有PUBDocumentVersion的文檔

我將不勝感激任何幫助,你可以給我,謝謝你們。

回答

0

這是一個優先級查詢。您可以使用row_number()rank()做到這一點:

select d.*, dv.* 
from d left join 
    (select dv.*, 
      row_number() over (partition by dv.IdDocument 
           order by (case when dv.state = 'PUB' then 1 
               when dv.state = 'UNP' then 2 
               else 3 
              end) 
           ) as seqnum 
     from documentversion dv 
    ) dv 
    on dv.IdDocument = d.IdDocument and 
     seqnum = 1; 

注:我不認爲加盟條件是你的問題是正確的。

+0

與您的方法'UNP'的顯示狀態的UnPublishedDate最低,我需要最高的一個,另外我需要的情況下,當DocumentVersion不是文檔,因此我使用LEFT JOIN。 –

+0

哦,我認爲Gordon剛剛錯過了'UnPublishDate desc',並且需要做一個左外連接。我的查詢幾乎相同 –

+0

@VorpulusLyphane。 。 。謝謝。 –

1
select * 
from Document D 
left outer join 
    (select *, 
    row_number()over(partition by IdDocumentVersion order by state asc, UnPublishDate desc) as row 
    from DocumentVersion) V 
on D.IdDocument = V.IdDocumentVersion 
and V.row = 1 

State asc在剛纔碰巧在這種情況下工作的方式有些破綻。你可能想更明確一個'什麼時候'(見戈登的答案)。

+0

謝謝。添加了「UnPublishDate desc」與他製作和編輯的編輯(@Gordon),但我不明白一件事情,請查看我最後一次對@Gordon的評論。 –

+0

Gordon以某種方式設法正確地預測了DV表中IdDocument列的存在(此列出現在你的'正在工作'查詢中的任何地方),並且信心十足,他實際上在他的答案中使用了它。我假設 - 錯誤地,事實證明 - 你簡單地將代表文檔ID的列命名爲IDDocumentVersion。換句話說,這兩個查詢旨在通過相同的事物進行分區:DocumentID。您可以按DocumentID進行分區,以便對於每個DocumentID,您可以按優先順序排列版本(PUB over UNP,然後再更早版本),並將其排在最前面。 –

+0

感謝您的幫助。 –