SQL Server条件查询主要详细信息查询结果

时间:2016-07-30 23:50:01

标签: sql sql-server tsql

我有这个问题。我们来看看查询:

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)。 Document可以有一个或多个DocumentVersions或没有DocumentVersionPUBLISHED州可以是UNPUBLISHEDPUBLISHEDDocumentVersion Document只能存在UNPUBLISHED一次(由应用程序控制),但可能存在多个DocumentVersions,或者所有UNPUBLISHED都是PUBLISHED DocumentVersion。 NOT Document不存在,当LEFT JOIN没有DocumentVersion记录时,它只是查询结果中的一个单词,这就是PUB的原因。

所以我的问题是:如何让查询完成下一个规则?

  • 如果UNP状态为Document,请忽略其他状态,我的意思是不要在此DocumentVersion <的查询结果中显示UNP个/ p>

  • 如果UNP状态为Unpublish(此处可能有多个DocumentVersion),则只显示日期最长为UnPublishDate的{​​{1}}({ {1}}表格有PUB列),此规则仅适用于文档没有DocumentVersion {{1}}的情况

非常感谢你能给我的任何帮助,谢谢你们。

2 个答案:

答案 0 :(得分: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

状态asc对于在这种情况下正常工作的方式有点骇人听闻。当&#39;时,您可能希望更明确地使用&#39; (见戈登的回答)。

答案 1 :(得分: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;

注意:我不认为您的问题中的连接条件是正确的。