2017-08-03 2 views
0

Ich brauche einen Bericht auf der Grundlage dieser Tabellenstruktur zu erstellen:SQL Server Outer Join?

Table structure image

Um die Anforderung zu erfüllen ich eine SQL Server-Ansicht erstellt die folgenden Kriterien: es

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') 

Für einige Werte zeigt 2 mal das gleiche Dokument Wert wie folgt:

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

Es geschieht, weil die gleiche documen t bezieht sich auf zwei oder mehr Pakete. Wenn diese Situation eintritt, möchte der Endbenutzer nur das neueste Paket basierend auf dem Attribut r_creation_date anzeigen.

So wollen sie dieses Ergebnis zeigen:

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

Welche Veränderungen brauche ich in meiner Sicht machen diese Anforderung zu erfüllen?

Antwort

0

Sie können ROW_NUMBER verwenden, um den aktuellsten Datensatz zu partitionieren und zu suchen, und dann aus der abgeleiteten Tabelle filtern, um nur den neuesten Datensatz aufzunehmen.

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

Ich denke, die Partition 'BY doc.r_object_id' der linken Seite des' JOIN' weil ein doc mehrere Pakete haben –

+0

Einverstanden, korrigierte Antwort. Vielen Dank! –