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