SQL Abfrage funktioniert noch nicht

Tehanu

Newbie
Registriert
Apr. 2017
Beiträge
3
Hallo, ich habe mein Problem in eine (hoffentlich) allgemeinverständliche Version übersetzt:

ich habe 3 Tabellen, in Tabelle A stehen alle Personen und ihr Reiseindex drin. Der Reiseindex besteht aus einem Kürzel des Reiseunternehmens und einer Nummer zB tui_197399). In Tabelle B stehen nur die letzten Reiseindexe bestimmter Personen der Gesellschaft tui (die Person an sich steht in Tabelle B leider nicht drin). Ich möchte nun alle Einträge von Tabelle B (was die letzte Reise ist) und alle vorherigen Reisen aus Tabelle A (dh Person + Index). Außerdem möchte ich den Zeitraum ab 01.01.2016 beschränken, das steckt in Tabelle C drin. Tabelle C kann ich über die Person Joinen.

Ich bin bisher so weit:

SELECT
A.Person,
A.Reiseindex,
C.Datum,
B.Reiseindex AS Reiseindex01

FROM A
LEFT JOIN C
ON A.Person = C.Person
LEFT JOIN B
ON A.Reiseindex = B.Reiseindex

WHERE
C.Datum between '01.01.2016' AND Current_date
AND A.Person IN
(SELECT A.Person
FROM A
WHERE SUBSTR(A.Reiseindex,1,3) = 'tui' )

Meine Überlegungen und Problemchen bisher:
- so wie es jetzt ist, bekomme ich alle Personen, die mit 'tui' gereist sind und alle vorherigen Reisen dazu; was zu viele Personen sind, da sich in Tabelle A auch Einträge mit tui befinden, die in Tabelle B nicht enthalten sind.
- leider fehlt die Auswahl nach Tabelle B; wenn ich WHERE SUBSTR(A.Reiseindex,1,3) = 'tui' durch WHERE SUBSTR(B.Reiseindex,1,3) = 'tui' ersetze, funktioniert die Abfrage leider nicht, weil ich dann nur wieder den Eintrag von Tabelle B bekomme und nicht auch die von Tabelle A
- ein inner Join zwischen Tabelle A und B bringt nichts, da ich dann nur wieder die letzte Reise von Tabelle B bekomme


Ich hoffe meine Frage ist verständlich und nicht zu lang :D
Vg Tehanu
 
Schau mal hier:
https://www.tutorialspoint.com/sql/sql-intersect-clause.htm

A+C joinen, dann im Ergebnis das gewünschte selektieren, in B gewünschtes selektieren, dann INTERSECT um beide Tabellen anhand des index zu verbinden. INTERSECT verbindet nur, wenn beidseitig der index vorhanden ist, der Rest fliegt raus.

Falls das nicht reicht kannst du auch UNION verwenden, musst dann aber unerwünschtes selbst rausfiltern.
 
Zuletzt bearbeitet:
Hallo Ozzy,

ich danke dir für deine Antwort. Mit INTERSECT bin ich leider nicht so richtig weiter gekommen. Deshalb habe ich mal einen kleinen Ausschnitt rausgesucht, dass mein Problem hoffentlich anschaulicher macht.

Tabelle A:
A.Person A.Reiseindex
Mueller tui_197399
Mueller tui_175682
Mueller tui_123498
Schmidt tui_197399
Schmidt tui_562891
Brown tui_498567
Brown tui_469438
Barthold lufthansa_789325

und Tabelle B
tui_197399

Das Ergebnis soll sein:
Mueller tui_197399
Mueller tui_175682
Mueller tui_123498
Schmidt tui_197399
Schmidt tui_562891

In Tabelle B ist der Reiseindex, Mueller und Schmidt haben diesen und ich möchte alle weiteren Einträge zu diesen Personen. Nach tui kann ich nicht selektieren, da dann zB Brown mit drin wäre, obwohl seine Reise nicht in Tabelle B auftaucht
 
Code:
select
	person,
	reiseindex
from
	a
where
	person in (
		select
			ainner.person
		from
			a ainner
			inner join b binner on ainner.reiseindex = binner.reiseindex
	)

?
 
Cool, danke mental, das scheint zu funktionieren, da wäre ich nie drauf gekommen :D
 
Zurück
Oben