2017-08-03 223 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

同意,糾正答案。謝謝! –