Wie kriege ich nicht vorhandene Daten raus?

Wie kriege ich nicht vorhandene Daten raus?

am 07.08.2006 22:32:11 von Jon Schmidt

Hallo,

ich habe folgende Problemchen, das ich nicht gebacken kriege. Ich habe
zwei Tabelle mit folgendem Aufbau:

Tabelle 1
id QID IID
1 1 1
2 1 2
3 1 3
4 2 1
5 2 2
6 2 3

Tabelle 2
VID QID IID
1 1 1
2 1 3

Was ich benötige sind für eine bestimmte QID alle Datensätze, die in
Tabelle 1, aber NICHT in Tabelle 2 enthalten sind. Also für QID =3D 1
eine und für QID =3D 2 drei Datensätze.

SELECT K.* FROM
(SELECT Tabelle 1.IID, Tabelle 2.IID AS RightID
FROM Tabelle 1 LEFT JOIN Tabelle 2 ON Tabelle 1.IID =3D Tabelle 2.IID
WHERE Tabelle 1.QID =3D $QID) K
WHERE K.RightID IS NULL

Mit obigem Select geht das nicht, da das Join auf den IID läuft. Klar.
Aber über die QID gehts halt auch nicht, weil in Tabelle 2 im
entscheidenden Fall ja keine QID zu finden ist.
Hat jemand noch eine Idee?

Danke schon mal,
Jon

Re: Wie kriege ich nicht vorhandene Daten raus?

am 07.08.2006 23:00:24 von Thomas Rachel

Jon Schmidt wrote:

> Was ich benötige sind für eine bestimmte QID alle Datensätze, die in
> Tabelle 1, aber NICHT in Tabelle 2 enthalten sind. Also für QID = 1
> eine und für QID = 2 drei Datensätze.
>
> SELECT K.* FROM
> (SELECT Tabelle 1.IID, Tabelle 2.IID AS RightID
> FROM Tabelle 1 LEFT JOIN Tabelle 2 ON Tabelle 1.IID = Tabelle 2.IID
> WHERE Tabelle 1.QID = $QID) K
> WHERE K.RightID IS NULL

Wozu dient die Verschachtelung mit dem Subselect?

> Mit obigem Select geht das nicht, da das Join auf den IID läuft. Klar.
> Aber über die QID gehts halt auch nicht, weil in Tabelle 2 im
> entscheidenden Fall ja keine QID zu finden ist.

Probieren wir mal:

create temporary table t1 (id int, qid int, iid int);
create temporary table t2 (vid int, qid int, iid int);
insert into t1 values (1,1,1),(2,1,2),(3,1,3),(4,2,1),(5,2,2),(6,2,3);
insert into t2 values (1,1,1),(2,1,3);


SELECT t1.IID
FROM t1
LEFT JOIN t2 ON t1.IID = t2.IID AND t1.QID=t2.QID
WHERE t1.QID = 1 AND t2.IID IS NULL

oder allgemeiner:

SELECT t1.QID,t1.IID
FROM t1
LEFT JOIN t2 ON t1.IID = t2.IID AND t1.QID=t2.QID
WHERE t2.IID IS NULL


HTH,

Thomas
--
Ein Realname im de.*-Usenet ist, ebenso wie eine Badehose im städtischen
Hallenbad, absolut überflüssig. Durch ein entsprechendes Outfit wird die
Benutzung beider Einrichtungen aber wesentlich vereinfacht.
(Werner Jakobi in dnq)

Re: Wie kriege ich nicht vorhandene Daten raus?

am 08.08.2006 10:31:38 von Jon Schmidt

Hallo Thomas,

Danke für Deinen Tip.
ich hane es jetzt anders gelöst. Ich lese die Daten für Tabelle 1 aus
und vergleiche sie mit IID aus Tabelle 2. Das mache ich mit zwei
Selects, das zweite innerhalb der ersten Schleife. Wenn es keinen
Datensatz im zweiten Select gibt, dann merke ich mir das. Damit habe
ich das Rätsel gelöst. Hatte gedacht, es gibt eine "elegantere"
Lösung - aber Hauptsache ist, dass es funktioniert.

Viele Grüße,
Jon


Thomas Rachel wrote:
> Jon Schmidt wrote:
>
> > Was ich benötige sind für eine bestimmte QID alle Datensätze, die=
in
> > Tabelle 1, aber NICHT in Tabelle 2 enthalten sind. Also für QID =3D 1
> > eine und für QID =3D 2 drei Datensätze.
> >
> > SELECT K.* FROM
> > (SELECT Tabelle 1.IID, Tabelle 2.IID AS RightID
> > FROM Tabelle 1 LEFT JOIN Tabelle 2 ON Tabelle 1.IID =3D Tabelle 2.IID
> > WHERE Tabelle 1.QID =3D $QID) K
> > WHERE K.RightID IS NULL
>
> Wozu dient die Verschachtelung mit dem Subselect?
>
> > Mit obigem Select geht das nicht, da das Join auf den IID läuft. Klar.
> > Aber über die QID gehts halt auch nicht, weil in Tabelle 2 im
> > entscheidenden Fall ja keine QID zu finden ist.
>
> Probieren wir mal:
>
> create temporary table t1 (id int, qid int, iid int);
> create temporary table t2 (vid int, qid int, iid int);
> insert into t1 values (1,1,1),(2,1,2),(3,1,3),(4,2,1),(5,2,2),(6,2,3);
> insert into t2 values (1,1,1),(2,1,3);
>
>
> SELECT t1.IID
> FROM t1
> LEFT JOIN t2 ON t1.IID =3D t2.IID AND t1.QID=3Dt2.QID
> WHERE t1.QID =3D 1 AND t2.IID IS NULL
>
> oder allgemeiner:
>
> SELECT t1.QID,t1.IID
> FROM t1
> LEFT JOIN t2 ON t1.IID =3D t2.IID AND t1.QID=3Dt2.QID
> WHERE t2.IID IS NULL
>
>
> HTH,
>
> Thomas
> --
> Ein Realname im de.*-Usenet ist, ebenso wie eine Badehose im städtischen
> Hallenbad, absolut überflüssig. Durch ein entsprechendes Outfit wird =
die
> Benutzung beider Einrichtungen aber wesentlich vereinfacht.
> (Werner Jakobi in dnq)

Re: Wie kriege ich nicht vorhandene Daten raus?

am 08.08.2006 10:51:33 von Frank Schenk

Jon Schmidt wrote:
> Hallo Thomas,
>=20
> Danke für Deinen Tip.
> ich hane es jetzt anders gelöst. Ich lese die Daten für Tabelle 1 a=
us
> und vergleiche sie mit IID aus Tabelle 2. Das mache ich mit zwei
> Selects, das zweite innerhalb der ersten Schleife. Wenn es keinen
> Datensatz im zweiten Select gibt, dann merke ich mir das. Damit habe
> ich das Rätsel gelöst. Hatte gedacht, es gibt eine "elegantere"
> Lösung - aber Hauptsache ist, dass es funktioniert.

Gibt es, nennt sich "Left OUTER JOIN". Siehe Handbuch - damit braucht=20
man 1 Query, keine Subqueries, keine Logik in der Programmiersprache.


Frank

Re: Wie kriege ich nicht vorhandene Daten raus?

am 08.08.2006 11:04:07 von Christian Kirsch

Frank Schenk schrieb:
> Jon Schmidt wrote:
>> Damit habe
>> ich das Rätsel gelöst. Hatte gedacht, es gibt eine "elegantere"
>> Lösung - aber Hauptsache ist, dass es funktioniert.
>
> Gibt es, nennt sich "Left OUTER JOIN". Siehe Handbuch - damit braucht
> man 1 Query, keine Subqueries, keine Logik in der Programmiersprache.

Du hast das "H"-Wort benutzt. Pfui. Das ist ja noch schlimmer als
"Erst googeln".

Re: Wie kriege ich nicht vorhandene Daten raus?

am 08.08.2006 15:37:50 von Jon Schmidt

Hi Frank,

leider hilf Left OUTER JOIN nicht. Das Problem: Wenn ich an IID joine,
dann bekomme ich auch für QIO=3D2 die Ergebnisse, und das ist nicht das,
was ich haben will. Leider hilft das Wort mit "H" auch nicht richtig
weiter.

MfG Jon



Frank Schenk wrote:
>
> Gibt es, nennt sich "Left OUTER JOIN". Siehe Handbuch - damit braucht
> man 1 Query, keine Subqueries, keine Logik in der Programmiersprache.
>=20
>=20
> Frank

Re: Wie kriege ich nicht vorhandene Daten raus?

am 08.08.2006 15:48:38 von Marco Dieckhoff

On 2006-08-07, Jon Schmidt wrote:
> Hallo,
>
> ich habe folgende Problemchen, das ich nicht gebacken kriege. Ich habe
> zwei Tabelle mit folgendem Aufbau:
>
> Tabelle 1
> id QID IID
> 1 1 1
> 2 1 2
> 3 1 3
> 4 2 1
> 5 2 2
> 6 2 3
>
> Tabelle 2
> VID QID IID
> 1 1 1
> 2 1 3
>
> Was ich benötige sind für eine bestimmte QID alle Datensätze, die in
> Tabelle 1, aber NICHT in Tabelle 2 enthalten sind. Also für QID = 1
> eine und für QID = 2 drei Datensätze.

Tabelle 1 und 2 kannst du aber nicht "direkt" vergleichen, es sei
denn T1.id entspricht T2.VID.
Also interpoliere ich mal deine Aussage:
Für eine bestimmte QID alle IID herausbekommen, die in Tabelle 1 zu
dem QID, aber nicht in Tabelle 2 zu dem QID stehen?

Also, mal so gedacht: Du willst also für QID=1 rausbekommen:
IID 2

und für QID=2
IID 1, 2, 3

geht recht einfach:

SELECT IID FROM Tabelle1 WHERE QID=$var AND IID NOT IN (SELECT IID
FROM Tabelle2 WHERE QID=$var)

Wie performant das wird bestimmt deine Datenbank mit ihrem Parser :)

--
Marco Dieckhoff
icq# 22243433
GPG Key 0x1A6C95BA -- http://www.frankonia-brunonia.de/keys

Re: Wie kriege ich nicht vorhandene Daten raus?

am 08.08.2006 15:54:53 von Thomas Rachel

Jon Schmidt wrote:

> Hatte gedacht, es gibt eine "elegantere"
> Lösung - aber Hauptsache ist, dass es funktioniert.

Ähm, was genau funktioniert denn an meiner Lösung

| SELECT t1.IID
| FROM t1
| LEFT JOIN t2 ON t1.IID = t2.IID AND t1.QID=t2.QID
| WHERE t1.QID = 1 AND t2.IID IS NULL
|
| oder allgemeiner:
|
| SELECT t1.QID,t1.IID
| FROM t1
| LEFT JOIN t2 ON t1.IID = t2.IID AND t1.QID=t2.QID
| WHERE t2.IID IS NULL


nicht? Mit Deinen Beispieldaten lieferte sie mir genau das, was Du
wolltest...

Thomas


P.S.:
> Thomas Rachel wrote:
>> Jon Schmidt wrote:

Bitte kein TOFU! http://learn.to/quote
--
Was soll bloß eine Signatur?
Na gut, nehmen wir sie zum Test: ae=ä, oe=ö, ue=ü, Ae=Ä, Oe=Ö, Ue=Ü,
sz=ß! Was noch?