2017-12-07 5 views
0

Ich habe eine Tabelle mit allen meinen Daten. Ich habe versucht, Joins, Unterabfragen und Gewerkschaften, aber keine gibt mir das gewünschte Ergebnis. Ich betreibe Oracle 12g.Mehrere select Abfragen in der gleichen Tabelle in Oracle

Dies ist ein Beispieltabelle:

FILENAME | VALUE | RAW 
AA  | XX | ZZ 
AA  | YY | WW 
DD  | GG | II 
DD  | HH | JJ 

Die aktuelle SQL-Anweisung, die ich benutze, ist:

SELECT FILENAME, VALUE VALUE1 FROM TABLE WHERE FILENAME='AA'; 
SELECT FILENAME, VALUE VALUE2 FROM TABLE WHERE FILENAME='DD'; 

Und ich bekomme folgendes Ergebnis:

FILENAME | VALUE1 
AA  | XX 
AA  | YY 

und

FILENAME | VALUE2 
DD  | GG 
DD  | HH 

aber ich brauche das Ergebnis zu sein:

FILENAME | VALUE1 | VALUE2 
AA  | XX  | GG 
AA  | YY  | HH 

Es spielt keine Rolle, wenn AA oder DD im Dateinamen ist. Es gibt keine Fremdschlüssel oder eindeutige Werte, die ich einfach INNER JOIN machen kann. Ich kann der Tabelle keine neuen Spalten hinzufügen. Ich hatte gehofft, meine Daten zu sortieren und dann Oracle's ROWNUM als eine temporäre Spalte zu verwenden, die ich dann verwenden könnte, um einen SELF JOIN zu machen, aber Oracle lässt mich nicht.

Beispiel:

SELECT L.FILENAME, L.VALUE VALUE1, R.VALUE VALUE2 
FROM TABLE L JOIN TABLE R 
ON (L.ROWNUM=R.ROWNUM) 
WHERE L.FILENAME IN ('AA','DD'); 

Jede Hilfe ist willkommen.

+0

In der Unterabfrage können Sie die 'row_number' generieren und sie dann verwenden, um sie außerhalb der Unterabfrage zu verbinden. Row_number ist eine Pseudospalte und Sie können es nicht direkt verwenden –

Antwort

0

Eine Möglichkeit row_number() mit wie folgt sein könnte.

with cte as(
select t.*, row_number() over(partition by FILENAME1 order by value1) as rn 
from table1 t 
) 
select t1.FILENAME1, t1.value1 as value1, t2.value1 as value2 
from cte t1 
join cte t2 
on t1.rn = t2.rn and t1.FILENAME1 = 'AA' and t2.FILENAME1 = 'DD' 

Was die oben tut, ist, dass in cte es row_number() von FILENAME1 von 1 Partition zugeordnet und dann in Hauptabfrage, verbindet es die Tabelle mit sich selbst auf row_number() und anderen entsprechenden Werte fest codierten.

Ergebnis:

+-----------+--------+--------+ 
| FILENAME1 | VALUE1 | VALUE2 | 
+-----------+--------+--------+ 
| AA  | XX  | GG  | 
| AA  | YY  | HH  | 
+-----------+--------+--------+ 

DEMO

+0

Danke für die gründliche Erklärung. Lief wie am Schnürchen. – jmkane314

0

Können Sie auf diese Weise versuchen:

SELECT T1.FILENAME, T1.VALUE VALUE1, T2.VALUE VALUE2 
FROM 
(SELECT FILENAME, VALUE, RAW, rownum RNUM FROM TABLE1 WHERE FILENAME = 'AA') T1, 
(SELECT FILENAME, VALUE, RAW, rownum RNUM FROM TABLE1 WHERE FILENAME = 'DD') T2 
WHERE T1.RNUM = T2.RNUM; 
+0

Es sollte 'rownum' sein, Sie können row_number() als Fensterfunktion verwenden –

+0

Dank @TomJMuthirenthi, habe ich die Bearbeitung gemacht. Dieser benötigt keine Fensterfunktion, daher sollte 'rownum' ausreichen. – Vashi

+0

Ich glaube nicht, dass Sie 3 Unterabfragen benötigen, Sie können 'rownum' in der ersten Unterabfrage selbst verwenden. Das sollte funktionieren. –

0

Sie können dies versuchen:

select a1, a2, b2 
    from (select row_number() over(order by filename) rn_a, filename a1, value a2 from mytable where filename = 'AA') inner join 
     (select row_number() over(order by filename) rn_b, value b2 from mytable filename = 'DD') on rn_a = rn_b 
order by a2; 

wo ROW_NUMBER eine analytische Funktion, in ver eingeführt. 8iR2. Er weist jeder Zeile, auf die er angewendet wird, eine eindeutige Nummer zu (entweder jede Zeile in der Partition oder jede von der Abfrage zurückgegebene Zeile). Durch Verschachteln einer Unterabfrage mit ROW_NUMBER innerhalb einer Abfrage, die die Werte ROW_NUMBER für einen angegebenen Bereich abruft, können Sie eine genaue Teilmenge der Zeilen aus den Ergebnissen der inneren Abfrage finden.

+0

Während nur Code-Antworten das ursprüngliche Problem lösen können, helfen einige Erklärungen beim Verständnis der Lösung und für zukünftige Referenz, –

+0

@NigelRen ok, danke. –

+0

@ BarbarosÖzhan danke für row_number() Funktion Hinweis. Bringt mich dazu, mich nächstes Mal näher mit den Unterlagen zu beschäftigen :) – jmkane314

Verwandte Themen