2016-03-24 3 views
1

ich eine Ansicht von zwei Tabellen zu konstruieren haben: Sprachen und ArtikelWie kann ich einen Ersatz Reihe nach links äußeren erhalten beitreten

Tabelle Sprache:

langId:1 langCode:en priority: 1 
langId:2 langCode:da priority: 2 
langId:3 langCode:es priority: 3 

Tabelle Artikel:

langId: 1, articleId: 1 title: "First art-en" originId: "ASDF" 
langId: 2, articleId: 2 title: "First art-da" originId: "ASDF" 
langId: 1, articleId: 3 title: "Second art-es" originId: "AAAA" 

Der gleiche Artikel in verschiedenen Sprachen wird eine einzigartige OriginId haben. Ich muss eine Ersatzzeile auswählen, wenn der Artikel für eine bestimmte Sprache nicht vorhanden ist und die auf der Sprachenpriorität basieren sollte.

Was wäre der beste Weg, dies zu erreichen? Ich möchte vermeiden, CTE/Temp-Tabellen und Schleifenanweisungen zu verwenden.

+0

Tun Vermeidung von CTE bedeutet vermeiden abgeleitete Tabellen? – veljasije

+0

Ich bin in Ordnung mit Unterabfragen, möchte aber keine temporären Tabellen/gemeinsamen Tabellenentitäten .. etc erstellen. Dies ist für eine Ansicht. – Modi

Antwort

0

Dies ist eine Priorisierungsabfrage. Sie können dies unter Verwendung von row_number():

select al.* 
from (select a.*, 
      row_number() over (partition by l.priority) as seqnum         
     from article a join 
      language l 
      on a.langid = l.langid 
    ) al 
where seqnum = 1; 
+0

Danke Gordon. Aber dann ... das löst nur die Hälfte des Problems. Sie erhalten die Zeile mit der geringsten Priorität .. aber dann sollte es "Ersatz" Zeile nach links/rechts äußeren Join geben. Wie kann ich das machen? – Modi