So konvertieren Sie eine SQL-Unterabfrage in einen join
Ich habe zwei Tabellen mit einer 1:n-Beziehung: "content" und "versioniert-content-Daten" (zum Beispiel, einen Artikel entity-und alle erstellten Versionen des Artikels). Ich möchte eine Ansicht erstellen, zeigt die top-version der jeweiligen "Inhalt".
Derzeit verwende ich diese Abfrage (mit einer einfachen Unterabfrage):
WÄHLEN t1.id, t1.Titel, t1.contenttext, t1.fk_idothertable t1.version VON mytable wie t1 WO (version = (SELECT MAX(version) ALS topversion FROM mytable WO (fk_idothertable = t1.fk_idothertable)))
Die Unterabfrage ist eigentlich eine Abfrage auf die gleiche Tabelle, die Extrakte den höchsten version eines bestimmten Elements. Beachten Sie, dass die versionierten Elemente haben die gleiche fk_idothertable.
In SQL Server ich habe versucht, zu erstellen eine indizierte Sicht dieser Abfrage, aber es scheint, ich bin nicht in der Lage seit Unterabfragen sind nicht zulässig, in indizierte sichten. So... hier ist meine Frage... Können Sie denken, ein Weg, um zu konvertieren, dass diese Abfrage eine Art Abfrage mit JOINs?
Scheint es, wie indizierte sichten können nicht enthalten:
- Unterabfragen
- common table expressions
- abgeleitete Tabellen
- HAVING-Klauseln
Ich bin verzweifelt. Alle anderen Ideen sind willkommen 🙂
Vielen Dank!
- ist deine Unterabfrage korrekt? Ich sehe nur eine Tabelle, auf die verwiesen
- Ja, ist eine Unterabfrage in der gleichen Tabelle, extrahiert die max-version eines Artikels, die Aktien der gleichen fk_idothertable
- btw... fk_idothertable ist der Fremdschlüssel für die master Tabelle
- Kann man einem erklären, auf diese, so dass wir sehen können, wo das eigentliche problem ist?
- Lose verknüpfte: stackoverflow.com/questions/733660/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese wahrscheinlich nicht helfen, wenn die Tabelle bereits in Produktion ist aber der richtige Weg ist, um dieses Modell zu machen, ist-version = 0 die permanente version und immer erhöhen Sie die version des ÄLTEREN Materials. Also, wenn Sie fügen eine neue version, die Sie würde sagen:
Dann diese Abfrage würde nur
Keine Unterabfragen, keine MAX-aggregation. Sie wissen immer, was die aktuelle version ist. Sie haben nie zu select max(version), um das einfügen des neuen Datensatzes.
Vielleicht so etwas?
Nur eine wilde Vermutung...
Könnten Sie in der Lage sein, um die MAX eine alias-Tabelle, die tut-Gruppe von.
Könnte es wie folgt Aussehen:
Ich denke FerranB war in der Nähe, aber nicht ganz die Gruppierung rechts:
M
Ich weiß nicht, wie effizient diese sein würde, aber:
So,...ich gehe davon aus, dass die "mytable" in der Unterabfrage war eine andere aktuelle Tabelle...also ich nannte es mytable2. Wenn es die gleiche Tabelle, dann wird dieser noch funktionieren, aber dann Stelle ich mir vor, dass fk_idothertable werde nur die 'id'.
Hoffe, das hilft