So konvertieren Sie eine SQL-Unterabfrage in einen Join

8

Ich habe zwei Tabellen mit einer 1: n-Beziehung: "content" und "versioned-content-data" (z. B. eine Artikelentität und alle Versionen dieses Artikels). Ich möchte eine Ansicht erstellen, die die oberste Version jedes "Inhalts" anzeigt.

Zur Zeit verwende ich diese Abfrage (mit einer einfachen Unterabfrage):

%Vor%

Die Unterabfrage ist eigentlich eine Abfrage an dieselbe Tabelle, die die höchste Version eines bestimmten Elements extrahiert. Beachten Sie, dass die versionierten Elemente dasselbe fk_idothertable haben.

In SQL Server habe ich versucht, eine indizierte Sicht dieser Abfrage zu erstellen, aber es scheint, dass ich nicht in der Lage bin, da Unterabfragen in indizierten Sichten nicht zulässig sind. Also ... hier ist meine Frage ... Können Sie sich eine Möglichkeit vorstellen, diese Abfrage in eine Art Abfrage mit JOINs zu konvertieren?

Es scheint so, als ob indizierte Sichten nicht enthalten können:

  • Unterabfragen
  • allgemeine Tabellenausdrücke
  • abgeleitete Tabellen
  • HAVING-Klauseln

Ich bin verzweifelt. Andere Ideen sind willkommen: -)

Vielen Dank!

    
sachaa 02.03.2009, 00:55
quelle

7 Antworten

13

Dies wird wahrscheinlich nicht helfen, wenn die Tabelle bereits in Produktion ist, aber der richtige Weg, dies zu modellieren, besteht darin, Version = 0 die permanente Version zu machen und immer die Version des älteren Materials zu inkrementieren. Wenn Sie also eine neue Version einfügen, würden Sie sagen:

%Vor%

Dann wäre diese Abfrage nur

%Vor%

Keine Unterabfragen, keine MAX-Aggregation. Sie wissen immer, was die aktuelle Version ist. Sie müssen nie Max (Version) auswählen, um den neuen Datensatz einzufügen.

    
jmucchiello 02.03.2009, 03:11
quelle
3

Vielleicht so etwas?

%Vor%

Nur eine wilde Vermutung ...

    
jpalecek 02.03.2009 01:12
quelle
0

Sie können möglicherweise den MAX zu einem Tabellenalias machen, der nach Gruppe gruppiert ist.

Es sieht vielleicht so aus:

%Vor%     
Charles Graham 02.03.2009 01:05
quelle
0

Ich denke, FerranB war nah dran, hatte aber nicht das Gruppierungsrecht:

%Vor%

M

    
yothenberg 02.03.2009 02:38
quelle
0
%Vor%     
Thava 23.05.2012 14:38
quelle
0

Ich weiß nicht, wie effizient das wäre, aber:

%Vor%     
Chris Shaffer 02.03.2009 01:05
quelle
-1

So ... Ich nehme an, dass der 'mytable' in der Unterabfrage ein anderer tatsächlicher Tisch war ... also nannte ich ihn mytable2. Wenn es die gleiche Tabelle ist, dann wird das immer noch funktionieren, aber dann stelle ich mir vor, dass fk_idothertable nur 'id' ist.

%Vor%

Hoffe, das hilft

    
James 02.03.2009 01:04
quelle

Tags und Links