Kombinieren Sie mehrere Zeilen in eine Zeile, Oracle
Ich arbeite mit einer Datenbank, die erstellt werden, in Oracle und in eine GIS-software, die durch SDE. Einer meiner colleuges wird, um einige Statistiken aus dieser Datenbank und ich bin nicht fähig, eine vernünftige SQL-Abfrage, die zum abrufen der Daten.
Ich habe zwei Tabellen, eine mit Eintragungen und eine mit registrationdetails. Es ist ein eins-zu-viele-Beziehung mit der Registrierung können ein oder mehrere details, die angeschlossen sind (keine maximale Anzahl).
- Tabelle: Registrierung
RegistrationID Datum TotLenght 1 01.01.2010 5 2 01.02.2010 15 3 05.02.2009 10
2.Tabelle: RegistrationDetail
DetailID RegistrationID Besitzer Typ Abstand 1 1 TD UB 1,5 2 1 AB 2 3 1 TD UQ 4 4 2 AB UQ 13 5 2 AB UR 13,1 6 3 TD 5
Möchte ich die daraus resultierende Auswahl, um so etwas wie dieses:
RegistrationID Datum TotLenght DetailID RegistrationID Besitzer Typ Abstand DetailID RegistrationID Besitzer Typ Abstand DetailID RegistrationID Besitzer Typ Abstand 1 01.01.2010 5 1 1 TD UB 1,5 2 1 AB 2 3 1 TD UQ 4 2 01.02.2010 15 4 2 AB UQ 13 5 2 AB UR 13,1 3 05.02.2009 10 6 3 TD 5
Mit einem normalen join, bekomme ich eine Zeile pro Anmeldung und detail. Kann mir jemand helfen mit diesem? Ich habe keine administrator-Rechte für die Datenbank, also kann ich nicht erstellen Sie keine Tabellen oder Variablen. Wenn es möglich ist, könnte ich kopieren Sie die Tabellen in Access.
Der Grund, warum das keine gute Idee ist, dass SQL eine Sprache ist, soll für relationale Datenbanken, das es immer um Beziehungen und führen in Beziehungen. Ihre gewünschte Leistung ist nicht einer Beziehung. siehe: en.wikipedia.org/wiki/Relational_model
InformationsquelleAutor Torbjørn | 2010-04-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die maximale Anzahl der Detail-Datensätze ist fest und bekannt ist, dann kann dies getan werden. Je größer die Zahl, desto mehr mühsam die Abfrage code. Das ist, warum gab uns die Natur cut ' N ' Paste.
Die folgende Abfrage verwendet ein paar tricks. Die Common Table Expression (aka Sub-Query Factoring) - Klausel kapselt die Abfrage auf RegistrationDetail, so können wir leicht finden Sie es in mehreren Orten. Die sub-Abfrage verwendet, eine Analytische Funktion ROW_NUMBER (), die uns erlaubt, zu identifizieren, jedes Detail-Datensatz innerhalb der RegistrationID Gruppe. Diese beiden Funktionen wwre eingeführt in Oracle 9i, so dass Sie nicht neu sind, aber viele Menschen wissen immer noch nicht über Sie.
Den main-Abfrage verwendet, die Outer-Joins verbinden Sie die Registrierung Tabelle mehrere Male, um Zeilen in der sub-query. Es schließt sich auf RegistrationID und die daraus abgeleiteten DetNo.
Offensichtlich, wenn Sie haben vier Detail-Datensätze pro RegistrationID benötigen Sie vier von diesen-Outer-Joins (und vier Sätze der Spalten in der Projektion).
Bearbeiten
Ich habe nur re-Lesen Sie Ihre Frage und sah die Furcht Worten "Keine maximale Anzahl". Sorry, in diesem Fall hast du Pech. Der einzige Weg, dieses problem zu lösen, die eine variable Anzahl von Sätzen mit dynamischen SQL, die Sie haben, effektiv ausgeschlossen (weil Sie Sie brauchen würden, um zusätzliche schema-Objekte).
edit 2
Gibt es eine andere Lösung, die ist nur über die Extraktion der Daten und vergessen, das layout. Oracle ermöglicht es uns zu erklären, inline-Cursorn, verschachtelte
select
Aussagen, die sich in der Projektion neben skalaren. Damit wird das problem der Anzeige der Ausgabe in einem client-tool.In dieser version verwende ich Oracle built-in XML-Funktionalität zum erzeugen der Ausgabe (auf der Grundlage, dass viele tools können das Rendern von XML in diesen Tagen). Die RegistrationDetails Datensätze Gruppe in ein XMLElement namens REG_DETAILS, die geschachtelt ist jede Registrierung aufnehmen.
InformationsquelleAutor APC
Sie können nicht mehrere Spalten mit den gleichen Namen in der gleichen Abfrage - oracle benennt Sie als 'Date_1', 'Date_2' etc. Was ist falsch mit mehreren Zeilen? Wie sind Sie auf es zu?
InformationsquelleAutor thecoop
InformationsquelleAutor Kashif