Anzeige:
Ergebnis 1 bis 11 von 11

Thema: Schlauch lass nach

  1. #1
    Registrierter Benutzer
    Registriert seit
    15.10.2005
    Ort
    Franken
    Beiträge
    362

    Schlauch lass nach

    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?
    Dank der Rekursion kann ich IF-Schleifen bauen.

    In neuem Glanz: www.turbohummel.de

  2. #2
    Registrierter Benutzer
    Registriert seit
    15.10.2005
    Ort
    Franken
    Beiträge
    362
    Na, keiner ne Idee?
    Dank der Rekursion kann ich IF-Schleifen bauen.

    In neuem Glanz: www.turbohummel.de

  3. #3
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    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.

  4. #4
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    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:
    Code:
    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
    Geändert von jan61 (12-08-2007 um 18:49 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    15.10.2005
    Ort
    Franken
    Beiträge
    362
    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.
    Dank der Rekursion kann ich IF-Schleifen bauen.

    In neuem Glanz: www.turbohummel.de

  6. #6
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Zitat Zitat von Turbohummel Beitrag anzeigen
    ...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):
    Code:
    select count(*), current_timestamp from tabelle;
    Wenn der Timestamp aus einer anderen Tabelle geholt werden soll, dann kannst Du auch wie folgt abfragen:
    Code:
    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

  7. #7
    Registrierter Benutzer
    Registriert seit
    15.10.2005
    Ort
    Franken
    Beiträge
    362
    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).
    Dank der Rekursion kann ich IF-Schleifen bauen.

    In neuem Glanz: www.turbohummel.de

  8. #8
    Registrierter Benutzer Avatar von elrond
    Registriert seit
    04.10.2001
    Ort
    potsdam
    Beiträge
    881
    wenn du aus mehreren Queries eine Ergebnismenge generieren willst, ist "UNION" vllt. dein freund.

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

    Kann aber auch sein, dass ich deine Frage nicht so recht verstanden habe...
    "Um die Welt zu ruinieren, genügt es, wenn jeder seine Pflicht tut." (Winston Churchill)

  9. #9
    Registrierter Benutzer
    Registriert seit
    15.10.2005
    Ort
    Franken
    Beiträge
    362
    Ne, Union liefert:
    W1
    W2
    Also in zwei Zeilen. Ich wills in 2 Spalten
    Dank der Rekursion kann ich IF-Schleifen bauen.

    In neuem Glanz: www.turbohummel.de

  10. #10
    Registrierter Benutzer Avatar von elrond
    Registriert seit
    04.10.2001
    Ort
    potsdam
    Beiträge
    881
    dann kommst du an subselects nicht vorbei

    Code:
    select (select f1 from t1 where x=1) as W1,(select f1 from t2 where x=1) as W2
    "Um die Welt zu ruinieren, genügt es, wenn jeder seine Pflicht tut." (Winston Churchill)

  11. #11
    Registrierter Benutzer
    Registriert seit
    15.10.2005
    Ort
    Franken
    Beiträge
    362
    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.
    Dank der Rekursion kann ich IF-Schleifen bauen.

    In neuem Glanz: www.turbohummel.de

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •