PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : spezieller sql-query



BLUESCREEN3D
22-02-2004, 22:10
angenommen man hat eine tabelle mit einer spalte "id"
diese enthält drei zeilen mit den werten 1 bis 3

tabelle1
---------
spalte id
---------
1
2
3

dazu kommt eine zweite tabelle mit zwei spalten: "id","name"
die enthält nur zwei zeilen: 1, name1 und 2, name2

tabelle2
---------------------------
spalte id, spalte name
---------------------------
1, name1
2, name2

d.h. zur id 3 gibt es keinen eintrag in der 2. tabelle

wenn dem so wäre könnte man einen einfachen query ausführen, um passend zu den ids aus tabelle1 die namen zu kriegen:
SELECT tabelle2.name FROM tabelle1,tabelle2 WHERE tabelle1.id=tabelle2.id



gibt es auch eine möglichkeit, das mit einem query zu lösen, falls tabelle2 nicht alle ids aus tabelle1 enthält?
so in der art, dass man dann für "name" NULL zurückgegeben kriegt?

Christoph
23-02-2004, 09:50
Ja! Schau mal in dein SQL-Handbuch unter dem Stichwort OUTER JOIN nach.

BLUESCREEN3D
23-02-2004, 14:53
Original geschrieben von Christoph
Ja! Schau mal in dein SQL-Handbuch unter dem Stichwort OUTER JOIN nach.
thx, genau so gehts :)

bei mysql:
SELECT tabelle2.name FROM tabelle1 LEFT JOIN tabelle2 ON tabelle1.id=tabelle2.id



jetzt noch eine kleine erweiterung, die ich irgendwie nicht zu lösen kriege:

tabelle1 hat zwei spalten:
------------
id, id2
------------
1, 4
2, 1
3, 8

tabelle2 hat noch immer zwei spalten:
---------------------------
spalte id, spalte name
---------------------------
1, name1
2, name2



nun soll ein query ausgeführt werden, der passend zu tabelle1.id und tabelle1.id2 die namen aus tabelle2 holt, falls vorhanden

ich habe versucht, das so zu lösen:


SELECT Y.name,Z.name FROM tabelle1 AS X LEFT JOIN tabelle2 AS Y, tabelle2 AS Z ON X.id=Y.id AND X.id=Z.id
Daraufhin stieg die Prozessorlast des mysqld, die anzahl der connections stieg bis zum maximum und von da an geht scheinbar nichts mehr (muss wohl der mysqld neugestartet werden :( )

BLUESCREEN3D
23-02-2004, 15:15
nach ca. 10 minuten war die datenbank wieder verfügbar, aber die zeit lang hat der eine query die wohl komplett blockiert :/

quinte17
23-02-2004, 16:14
select x.name, y.name
from tabelle1,
tabelle2 x,
tabelle2 y
where tabelle1.id = x.id
and tabelle1.id2 = y.id

so ist des grundsätzlich richtig... muss nur noch der richtige outerjoin rein *gg*
unter oracle:

select x.name, y.name
from tabelle1,
tabelle2 x,
tabelle2 y
where tabelle1.id = x.id(+)
and tabelle1.id2 = y.id(+)

sollte es so aussehen *me betet dass mysql auch mal sowas kann *gg**

greetz

BLUESCREEN3D
23-02-2004, 17:10
Original geschrieben von quinte17
unter oracle:

select x.name, y.name
from tabelle1,
tabelle2 x,
tabelle2 y
where tabelle1.id = x.id(+)
and tabelle1.id2 = y.id(+)

sollte es so aussehen *me betet dass mysql auch mal sowas kann *gg**
so geht es unter mysql schonmal nicht :D

aber ich habe inzwischen doch im mysql-manual ganz versteckt ein einziges beispiel für ein doppeltes join gefunden: http://www.mysql.de/doc/de/JOIN.html (das 4. beispiel unten)

daraus habe ich dann meinen query so geschlossen:


SELECT
Y.name,Z.name
FROM
tabelle1 AS X
LEFT JOIN tabelle2 AS Y
ON X.id=Y.id
LEFT JOIN tabelle2 AS Z
ON X.id2=Z.id

und das funzt :)

Christoph
24-02-2004, 07:47
Original geschrieben von quinte17
select x.name, y.name
from tabelle1,
tabelle2 x,
tabelle2 y
where tabelle1.id = x.id(+)
and tabelle1.id2 = y.id(+)

Die Notation mit (+) für outer Joins ist Oracle spezifisch. SQL2-Standard ist "LEFT OUTER JOIN" bzw. "RIGHT OUTER JOIN". Ich glaube ab Version 8.0 unterstützt Oracle auch den SQL2-Standard.

quinte17
25-02-2004, 09:07
wenn du eine zeile über meinem select gelesen hättest... da steht für oracle ;)

greetz

Christoph
25-02-2004, 12:59
Original geschrieben von quinte17
wenn du eine zeile über meinem select gelesen hättest... da steht für oracle ;)

Tschuldigung, diese Zeile habe ich gelesen, aber ich habe die letzte Zeile ("*me betet ...") irrtümlicherweise so verstanden, dass Du dich fragst, ob das bei anderen DBS'en auch möglich ist. Die Antwort auf diese -von Dir anscheinend gar nicht gestellte Frage- war "Nein".