2017-08-03 226 views
0

我需要在此基础上表结构来创建报告:sql服务器外连接?

Table structure image

为了满足我创建使用下面的查询SQL Server视图的要求:

SELECT doc.object_name as doc_name, 
     pack.object_name as pack_name, 
     pack.r_creation_date as pack_date 
FROM vale_eng_document_sp doc 
left outer join dm_relation_s rel on doc.r_object_id = rel.parent_id 
left outer join vale_eng_package_sp pack on rel.child_id = pack.r_object_id 
WHERE 
    doc.r_object_type='vale_eng_document' 
and doc.i_is_deleted = 0 
and (pack.i_is_deleted IS NULL or pack.i_is_deleted = 0) 
and (rel.relation_name IS NULL or rel.relation_name='AO Project Package') 

对于一些价值就说明2倍相同的文件价值如下:

DOCUMENT1  PACKAGE1 01/01/2016 00:00:00 
DOCUMENT1  PACKAGE2 01/01/2017 00:00:00 
DOCUMENT2  NULL  NULL 

这是因为相同的文件t与两个或更多包有关。 如果出现这种情况,最终用户只想根据r_creation_date属性显示最新的软件包。

所以他们想显示这个结果:

DOCUMENT1  PACKAGE2 01/01/2017 00:00:00 
DOCUMENT2  NULL  NULL 

我需要什么样的变化在我看来,以满足这一要求做什么呢?

回答

0

您可以使用ROW_NUMBER进行分区并找到最近的记录,然后从派生表中筛选以仅包含最近的记录。

SELECT doc_name, pack_name, pack_date 
FROM (
    SELECT doc.object_name as doc_name, pack.object_name as pack_name, pack.r_creation_date as pack_date, 
     ROW_NUMBER() OVER (PARTITION BY doc.r_object_id ORDER BY pack.r_creation_date DESC) AS RowNum 
    FROM vale_eng_document_sp doc 
     left outer join dm_relation_s rel on doc.r_object_id = rel.parent_id 
     left outer join vale_eng_package_sp pack on rel.child_id = pack.r_object_id 
    WHERE doc.r_object_type='vale_eng_document' 
     and doc.i_is_deleted = 0 
     and (pack.i_is_deleted IS NULL or pack.i_is_deleted = 0) 
     and (rel.relation_name IS NULL or rel.relation_name='AO Project Package') 
    ) T 
WHERE T.RowNum = 1 -- Only most recent record as requested 
+0

我认为分区是'由'JOIN'的doc.r_object_id'左侧,因为文档可以有多个包 –

+0

同意,纠正答案。谢谢! –