Summierung über 2 Tabellen

Artorius

Mitglied Plutonium
Hallo,
ich möchte gerne per Querie die Zahl aus einer Spalte in der Tabelle TAB1 mit dem Ergebnis einer Abfrage auf die Tabelle TAB2 addieren. Das Query soll zudem auf unterschiedlichen Datenbanken laufen

Folgendes habe ich gebastelt:

SQL:
SELECT ANZAHL1
       + (SELECT Count(*) AS Anzahl2
          FROM   (SELECT ITEMS
                  FROM   TAB2
                  WHERE  ...
                  GROUP  BY ITEMS))
FROM   TAB1
WHERE  ...
Dies schlägt allerdings fehl, wenn die where Bedingung auf TAB1 kein Ergebnis zurückliefert.
Es soll aber berücksichtigt werden, dass sowohl Tab1 als auch Tab2 kein Ergebnis lieferen kann. Die Where Bedingungen sorgen aber dafür, dass immer nur maximal eine Zeile selektiert wird.

Nun habe ich das ganze über ein Full join probiert:

SQL:
SELECT Nvl(A.ANZAHL1, 0) + Nvl(B.ANZAHL2, 0) AS Anzahl
FROM   (SELECT ANZAHL1
        FROM   TAB1
        WHERE  ...) A
       FULL JOIN (SELECT Count(*) AS Anzahl2
                  FROM   (SELECT ITEMS
                          FROM   TAB2
                          WHERE  ...
                          GROUP  BY ITEMS)) B
              ON 1 = 1

Das scheint zu funktionieren. Aber, frage ich mich, ob das Ganze nicht doch etwas eleganter geht. Gerade wegen der join Bedingung sieht das ganze doch eher nach "Missbrauch" aus. Oder geht das schon so in Ordnung?

*gruß*
Artorius
 
item: MySQL? Oder Oracle? Oh NVL(). Also Oracle.

item: Und was meinst du mit "Das Query soll zudem auf unterschiedlichen Datenbanken laufen" Sind die 2 Tabellen auf verschiedenen Datenbanken?
Oder soll das SQL auf verschiedenen Systemen laufen? Der NVL() ist nur Oracle. Der Läuft nicht unter anderen DBMS wie zum Beispiel MySQL.

item: Die Bedingungen für den WHERE. Haben die einen Zusammenhang? Zeig mal deine 2 WHERE

item: Auf B.ANZAHL2 brauchst du keinen NVL() zu setzen. Dank dem COUNT() hast du immer ein Resultat drin. Auch wenns 0 ist.

item: Dein Verschachtelter COUNT() kannst du auch mit einem COUNT(DISTINCT myField) lösen

item: wenn du einfach beide Quellen in den FROM-Teil setzt ohne sie zu verknüpfen, dann hast du ebenfalls ein FULL OUTER JOIN mit 1=1

SQL:
select
    nvl(a.ANZAHL1, 0) + b.ANZAHL2 as Anzahl
from
    TAB1 a,
    (
        select count(distinct c.ITEMS) as ANZAHL2
        from TAB2 c
        where c.X = 123
    ) b
where
    a.Y = 456;
 
Zuletzt bearbeitet:
Hallo,
und erstmal danke für deine Antwort.
Die Abfrage soll auf unterschiedlichen Datenbanksystemen laufen. Ich teste hier hauptsächlich unter Oracle, daher das NVL. Muss dann natürlich durch coalesce ersetzt werden.

Die where Bedingungen haben keinerlei Zusammenhang. Was du als Beispiel angebracht hast, ist völlig ausreichend.

Wenn ich nun aber das Query so ausführe und aufgrund der Bedingung "a.Y = 456" kein Ergebnis aus der Tabelle TAB1 vorliegt, ist das komplette Ergebnis leer. Das soll ja gerade nicht sein...

*gruß*
Artorius
 
Moin Artorius,

versuch es so:
SQL:
Select AnzA+AnzB as Anzahl from (
  SELECT
    (select nvl(ANZAHL1, 0)
      From TAB1 
       where Y=456) as AnzA
,    (SELECT COUNT(DISTINCT ITEMS)
       FROM TAB2
        WHERE X = 123) as AnzB
from Dual
) whatever;

Grüße
Biber
 
Zuletzt bearbeitet:
Hi Biber,
ich hab mal deine Abfrage genommen und noch etwas umgeschrieben. Dazu statt Dual (was es nur unter Oracle gibt) eine Tabelle genommen, die garantiert nur einen Eintrag hat.

SQL:
SELECT
  (
  (
    SELECT
      Coalesce(MAX(ANZAHL1),0)
    FROM
      TAB1
    WHERE
      Y = 456
  )
  +
  (
    SELECT
      Count(DISTINCT ITEMS)
    FROM
      TAB2
    WHERE
      X = 123
)
  ) AS ANZAHL
FROM
  TAB3;

Ist ungefähr doppelt so schnell wie mein Versuch mit dem Full outer join. Danke für den Denkanstoß!

*gruß*
Artorius
 
Zurück