Problem mit Abfrage (Ausschliessen)

Problem mit Abfrage (Ausschliessen)

am 20.09.2007 16:15:06 von Klaus Herzberg

Hallo,
ich benoetige frdlw. Hilfe bei einer Abfrage:

Tabellen:

firma
-----
id name ...

branche
-------
id name ...

firma_branche
-------------
id firma_id branche_id
1 1 1
2 1 2
3 1 3
4 2 1
5 2 2

Nun will ich eine Abfrage machen, die mir aus "firma_branche"
alle Firmen ermittelt, wo "firma" NICHT in "branche 3" ist.

SELECT t1.id FROM firma t1
INNER JOIN firma_branche t2 ON t1.id = t2.firma_id
WHERE t2.branche_id <> 3

Da bekomme ich natuerlich trotzdem firma 1 und 2

Da habe ich erweitert:

SELECT t1.id FROM firma t1
INNER JOIN firma_branche t2 ON t1.id = t2.firma_id
INNER JOIN firma_branche t2 ON t2.branche_id = t3.branche
WHERE t3.branche_id <> 3

Dies scheint die richtige Abfrage zu sein, es dauert halt nur sehr sehr
lange.

Vielleicht hat jemand einen Tipp.

Danke. mfg. klaus.

Re: Problem mit Abfrage (Ausschliessen)

am 20.09.2007 17:49:24 von Claus Reibenstein

Klaus Herzberg schrieb:

> ich benoetige frdlw. Hilfe bei einer Abfrage:
>
> Tabellen:
>
> firma
> -----
> id name ...
>
> branche
> -------
> id name ...

Wie wäre es mal mit der _echten_ Tabellendefinition?

Logischerweise, weil beide auch in anderen Branchen sind.

Spontan fällt mir nur eine Sub-SELECT-Lösung ein:

SELECT id FROM firma WHERE id NOT in
( SELECT t1.id FROM firma t1
JOIN firma_branche t2 ON t1.id = t2.firma_ID
WHERE t2.branche_id <> 3)

> SELECT t1.id FROM firma t1
> INNER JOIN firma_branche t2 ON t1.id = t2.firma_id
> INNER JOIN firma_branche t2 ON t2.branche_id = t3.branche
> WHERE t3.branche_id <> 3

Diese Abfrage enthält mindestens 2 Fehler. Es wäre besser, das Original
per Copy&Paste hier rein zu kopieren, anstatt es (fehlerhaft) abzutippen.

> Dies scheint die richtige Abfrage zu sein, es dauert halt nur sehr sehr
> lange.

Das deutet auf fehlende Indizes hin. Genaueres lässt sich aufgrund
Deiner unvollständigen Angaben (s.o., Tabellendefinition) nicht sagen.

Gruß. Claus

Re: Problem mit Abfrage (Ausschliessen)

am 21.09.2007 13:45:45 von Daniel Fischer

Klaus Herzberg!

> Nun will ich eine Abfrage machen, die mir aus "firma_branche"
> alle Firmen ermittelt, wo "firma" NICHT in "branche 3" ist.

Ist das folgende eine Verbesserung?

select firma.firma_id, name from firma
inner join firma_branche on firma.firma_id = firma_branche.firma_id
group by firma_id
having max(branche_id=3) = 0;


Gruß
Daniel

Re: Problem mit Abfrage (Ausschliessen)

am 21.09.2007 14:14:45 von dnoeth

Klaus Herzberg wrote:

> firma
> -----
> id name ...
>
> branche
> -------
> id name ...
>
> firma_branche
> -------------
> id firma_id branche_id
> 1 1 1
> 2 1 2
> 3 1 3
> 4 2 1
> 5 2 2
>
> Nun will ich eine Abfrage machen, die mir aus "firma_branche"
> alle Firmen ermittelt, wo "firma" NICHT in "branche 3" ist.

Dann schreib das doch einfach :-)
Du willst alle Firmen, für die kein Eintrag mit deren firma_id existiert:

select * from firma f
where not exists
(select * from firma_branche fb
where f.id = fb.firma_id
)

oder etwas schlechter zu verstehen:
select f.*
from firma f
left join firma_branche fb
on f.id = fb.firma_id
and fb.branche_id = 3
where fb.firma_id is null

Dieter

Re: Problem mit Abfrage (Ausschliessen)

am 21.09.2007 21:34:16 von Klaus Herzberg

Hallo,
schoen, wenn es jemand gibt, der eine Loesung hat und nicht nur schimpft.

Danke. mfg. klaus.

Daniel Fischer wrote:
> Klaus Herzberg!
>
>> Nun will ich eine Abfrage machen, die mir aus "firma_branche"
>> alle Firmen ermittelt, wo "firma" NICHT in "branche 3" ist.
>
> Ist das folgende eine Verbesserung?
>
> select firma.firma_id, name from firma
> inner join firma_branche on firma.firma_id = firma_branche.firma_id
> group by firma_id
> having max(branche_id=3) = 0;
>
>
> Gruß
> Daniel

Re: Problem mit Abfrage (Ausschliessen)

am 21.09.2007 21:35:19 von Klaus Herzberg

Hallo,
danke fuer die Hinweise.


mfg. klaus.


Dieter Noeth wrote:
> Klaus Herzberg wrote:
>
>> firma
>> -----
>> id name ...
>>
>> branche
>> -------
>> id name ...
>>
>> firma_branche
>> -------------
>> id firma_id branche_id
>> 1 1 1
>> 2 1 2
>> 3 1 3
>> 4 2 1
>> 5 2 2
>>
>> Nun will ich eine Abfrage machen, die mir aus "firma_branche"
>> alle Firmen ermittelt, wo "firma" NICHT in "branche 3" ist.
>
> Dann schreib das doch einfach :-)
> Du willst alle Firmen, für die kein Eintrag mit deren firma_id existiert:
>
> select * from firma f
> where not exists
> (select * from firma_branche fb
> where f.id = fb.firma_id
> )
>
> oder etwas schlechter zu verstehen:
> select f.*
> from firma f
> left join firma_branche fb
> on f.id = fb.firma_id
> and fb.branche_id = 3
> where fb.firma_id is null
>
> Dieter