我有这个问题。我们来看看查询:
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
或没有DocumentVersion
。 PUBLISHED
州可以是UNPUBLISHED
或PUBLISHED
。 DocumentVersion
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}}的情况
非常感谢你能给我的任何帮助,谢谢你们。
答案 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;
注意:我不认为您的问题中的连接条件是正确的。