Join zweier Tabellen (Oracle-SQL)

Hallo SQL-Profis,
ich muß ein SQL-Statement für eine Oracle-DB erstellen, das
zwei Tabellen miteinander verbindet. Das Ergebnis soll eine Liste von Namen sein, eingeschränkt auf eine bestimmte PersNr.
Ist die PersNr in Tab2 nicht enthalten, so wird nur der Name aus der Tab1 ausgegeben. Ansonsten alle Namen der Persnr aus Tab1 und alle Namen der PersGrp die für die PersNr in Tab2 angelegt sind.

Tab1: PersNr, PersGrp, Name
Tab2: PersNr, PersGrp

Ich habe das SQL in einer Access2000-DB erstellt und laufen lassen. Hier funktioniert alles prima. Wende ich dieses aber in Oracle an, so wird die Ausführung abgebrochen. (SQL-kann nicht ausgeführt werden)
Hier das Access-Statement:
SELECT Tab1.PersNr, Tab1.PersGrp, Tab1.Name, Tab2.PersGrp
FROM Tab1 INNER JOIN Tab2 ON Tab1.PersGrp = Tab2.PersGrp
WHERE (((Tab2.PersNr)=„4711“)) OR (((Tab1.PersNr)=„4711“));

Wenn Ihr weiterhelfen könnt, vielen Dank!
Rainer

Hallo SQL-Profis,
ich muß ein SQL-Statement für eine Oracle-DB erstellen, das
zwei Tabellen miteinander verbindet. Das Ergebnis soll eine
Liste von Namen sein, eingeschränkt auf eine bestimmte PersNr.
Ist die PersNr in Tab2 nicht enthalten, so wird nur der Name
aus der Tab1 ausgegeben. Ansonsten alle Namen der Persnr aus
Tab1 und alle Namen der PersGrp die für die PersNr in Tab2
angelegt sind.

Tab1: PersNr, PersGrp, Name
Tab2: PersNr, PersGrp

Ich habe das SQL in einer Access2000-DB erstellt und laufen
lassen. Hier funktioniert alles prima. Wende ich dieses aber
in Oracle an, so wird die Ausführung abgebrochen. (SQL-kann
nicht ausgeführt werden)
Hier das Access-Statement:
SELECT Tab1.PersNr, Tab1.PersGrp, Tab1.Name, Tab2.PersGrp
FROM Tab1 INNER JOIN Tab2 ON Tab1.PersGrp = Tab2.PersGrp
WHERE (((Tab2.PersNr)=„4711“)) OR (((Tab1.PersNr)=„4711“));

ich kann dir nicht versprechen, dass es klappt, aber probier’s doch mal so:
SELECT Tab1.PersNr, Tab1.PersGrp, Tab1.Name, Tab2.PersGrp
FROM Tab1, Tab2
WHERE (Tab1.PersGrp = Tab2.PersGrp) AND ((Tab1.PersGrp = „4711“) OR (Tab2.PersNr = „4711“))

vielleicht kann da nochmal ein fachmann ran, wenn das nicht klappt. bin ja nur anfänger :o)

gruß
tobias

Guten Morgen Tobias,
ich habe Deinen Vorschlag getestet, so was ähnliches habe ich auch schon probiert, aber leider funktioniert es so nicht. Ich bekomme immer die leere Menge. Jedenfalls Danke für Deinen Vorschlag,
Gruß
Rainer

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

dann probier’s doch mal über einen view:

CREATE VIEW TabJoin AS
SELECT Tab1.PersNr, Tab1.PersGrp, Tab1.Name, Tab2.PersGrp
FROM Tab1, Tab2
WHERE Tab1.PersGrp = Tab2.PersGrp
go

und anschließend grifst du per select drauf zu:

SELECT *
FROM TabJoin
WHERE Tab1.PersNr = „4711“
go

es gibt noch eine verschachtelte variante, in der du das ergebnis der einen select-anfrage als basis für die andere nutzen kannst, aber das fällt mir ad hoc nicht mehr ein…

gruß
tobias

Die Idee mit der View ist toll, leider trifft es immer noch nicht ganz ins Ziel. Ich habe inzwischen eine Lösungsalternative. Wenn Dich das interessiert hier das SQL:

select tab1.persnr,tab1.persgrp,tab1.name
from tab1 where tab1.persnr = ‚4711‘
union select tab2.persnr,tab2.persgrp, ‚‘ as name
from tab2 where tab2.persnr = ‚4711‘;

Die Abfrage funktioniert, allerdings wird mir kein Name ausgeben(Name=blank), falls der User nicht auch in Tab2 vorhanden ist. Die Namen sind aber das entscheidende an dieser Abfrage. Es hängt alles am Ausdruck „’’ as name“.
Wenn Dir noch etwas einfällt, danke für die INFO
Gruß
Rainer

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Endlich die LÖSUNG:

select distinct tab1.persnr,tab1.persgrp,tab1.name
from tab1,tab2
where tab1.persnr=‚4711‘ or
(tab2.persnr=‚4711‘ and tab1.persgrp=tab2.persgrp);

Vielen Dank für Deine Anregungen!!
Frohes Schaffen
Rainer

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

bitte.

select distinct tab1.persnr,tab1.persgrp,tab1.name
from tab1,tab2
where tab1.persnr=‚4711‘ or
(tab2.persnr=‚4711‘ and tab1.persgrp=tab2.persgrp);

ja, das sieht sehr gut aus! danke, dass du mir die lösung noch mitgeteilt hast.

Vielen Dank für Deine Anregungen!!

immer wieder gern!

gruß
tobias

Ich habe das SQL in einer Access2000-DB erstellt und laufen
lassen. Hier funktioniert alles prima. Wende ich dieses aber
in Oracle an, so wird die Ausführung abgebrochen. (SQL-kann
nicht ausgeführt werden)
Hier das Access-Statement:
SELECT Tab1.PersNr, Tab1.PersGrp, Tab1.Name, Tab2.PersGrp
FROM Tab1 INNER JOIN Tab2 ON Tab1.PersGrp = Tab2.PersGrp
WHERE (((Tab2.PersNr)=„4711“)) OR (((Tab1.PersNr)=„4711“));

Ich bin auch schon auf Probleme gestossen beim Umstieg auf Oracle… am einfachsten baut man die JOINs immer so um, dass man in der FROM Clause nur alle Tabellen angibt

FROM Tab1, Tab2
und die ON-bedingung ins WHERE reinmacht
WHERE tab1.persgrp = tab2.persgrp

Hallo Bruno,
für Deinen Hinweis vielen Dank, So was ähnliches haben wir bereits ermittelt. Lies bitte mal die Antwort v. 10.7. um 13:33

schönes Wochenende
Rainer

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]