PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schlauch lass nach



Turbohummel
10-08-2007, 06:27
Hallo,

Habe 2 Abfragen (mal ein einfaches Beispiel)
SELECT 1 w FROM DUAL
und
SELECT 2 w FROM INTEGER

Jetzt möchte ich einen Ergebnisselect generieren, der die beiden ergebnisse in 2 Spalten zusammenbringt.

Einzige Lösung, die zwar funzt, aber nicht grade schön ist:
SELECT t1.w w1, t2.w w2
FROM
( SELECT 1 w FROM DUAL) t1
LEFT JOIN
( SELECT 2 w FROM INTEGER) t2 ON 1 = 1

Gibts da ne schönere Variante?

Turbohummel
12-08-2007, 08:03
Na, keiner ne Idee?

BLUESCREEN3D
12-08-2007, 14:57
Ohne JOIN wird es wohl nicht gehen.
Aber falls du sicher bist, dass beide Abfragen genau eine Zeile zurückgeben, könntest du einen CROSS JOIN statt einem LEFT JOIN machen.

jan61
12-08-2007, 17:41
Das Problem bei dieser Abfrage ist - so wie ich das sehe - dass aus beiden Tabellen ein konstanter Wert gelesen wird. Die Tabelle DUAL kenne ich aus Oracle - aber woher kommt INTEGER? Mein Oracle kennt diese Tabelle nicht.

Außerdem verstehe ich im Zusammenhang mit dem Originalpost nicht, welchen Sinn die Abfrage machen soll. Wenn ich 2 Konstanten haben will, dann kann ich die doch gleich (ohne SQL) benutzen. Ich vermute mal, dass die Aufgabenstellung in einem bestimmten Umfeld einen Sinn ergibt?

Um zur Frage zurückzukommen - Vielleicht ist ja dieser SQL eleganter (getestet mit Oracle 10g), ich habe nur die bei mir nicht existierende Tabelle INTEGER durch DUAL ersetzt:
SELECT (SELECT 1 FROM DUAL) w1, 2 w2 FROM DUAL;Funktioniert natürlich nur dann sauber, wenn der innere SELECT genau 1 Zeile zurückliefert.

Jan

Turbohummel
13-08-2007, 06:27
Das ganze war ein vereinfachtes Beispiel.


(mal ein einfaches Beispiel)

Ich habe 2 (oder mehr Abfragen), die Daten verdichten sollen. In wirklichkeit wären das meist COUNT(*) oder SUM(blub).
Ich brauch das Ergebnis in einer Zeile, weil der Ergebnissatz zusammen mit einem Timestamp automatisch in eine Tabelle weggeschrieben wird (so ne Art Mini-Data-Warehouse).

Die Idee mit dem
SELECT (SELECT 1 FROM DUAL) w1, 2 w2 FROM DUAL;
find ich gut, werd ich gleich mal ausprobieren, könnte etwas fixer sein.

jan61
13-08-2007, 22:35
...Ich habe 2 (oder mehr Abfragen), die Daten verdichten sollen. In wirklichkeit wären das meist COUNT(*) oder SUM(blub).
Ich brauch das Ergebnis in einer Zeile, weil der Ergebnissatz zusammen mit einem Timestamp automatisch in eine Tabelle weggeschrieben wird (so ne Art Mini-Data-Warehouse)....

Da hst Du zumindest mich aber ganz schön aufs Glatteis geführt ;-) Irgenwie dachte ich mir schon, dass die Frage einen Sinn ergibt, aber mit den konstanten Werten und den Tabellennamen bin ich in die falsche Richtung gestolpert.

Für die o. g. Situation brauchst Du eigentlich gar keine 2 Tabellen, Du benutzt einfach mit dem DBMS gelieferte Funktionen (Beispiel Oracle):
select count(*), current_timestamp from tabelle;Wenn der Timestamp aus einer anderen Tabelle geholt werden soll, dann kannst Du auch wie folgt abfragen:
select count(*), b.ts from tabelle1 a, tabelle2 b group by b.ts;In diesem Fall kriegst Du pro Eintrag in tabelle2 den count(*) aus tabelle1. Das ist zwar theoretisch eine Kreuzproduktabfrage, aber da count(*) - wie alle Aggregatfunktionen - nur 1 Wert zurückliefert, kann man sich Joins sparen.

Ist es das, was Du suchst?

Vielleicht beim nächsten Mal etwas weniger Abstraktion des Problems, dann kommen wir bestimmt schneller auf ne Idee :-)

Jan

Turbohummel
15-08-2007, 07:26
nein, das such ich nicht.
w1, w2 und w3 kommen aus 3 völlig unterschiedlichen Querrys (die für die Werte jeweils doch einige Berechnungen anstellen, alles 20-Zeiler).

elrond
16-08-2007, 11:33
wenn du aus mehreren Queries eine Ergebnismenge generieren willst, ist "UNION" vllt. dein freund.



select feld1, feld2 from tab1
union
select feld1, feld2 from tab2



Kann aber auch sein, dass ich deine Frage nicht so recht verstanden habe... :cool:

Turbohummel
20-08-2007, 17:04
Ne, Union liefert:
W1
W2
Also in zwei Zeilen. Ich wills in 2 Spalten ;)

elrond
21-08-2007, 06:18
dann kommst du an subselects nicht vorbei :cool:



select (select f1 from t1 where x=1) as W1,(select f1 from t2 where x=1) as W2

Turbohummel
21-08-2007, 17:24
Die Idee mit dem
SELECT (SELECT 1 FROM DUAL) w1, 2 w2 FROM DUAL;
find ich gut, werd ich gleich mal ausprobieren, könnte etwas fixer sein.

Hab ich ja schon geschrieben, und so auch umgesetzt.