SQL-Problem
Falk
- datenbank
0 Michael Schröpl0 Christian Kruse0 Falk0 Christian Kruse0 Falk0 Daniela Koller0 Falk0 Daniela Koller0 Falk
0 Onkel0 Daniela Koller0 Falk
Hallo Forum,
stehe im Moment voll auf der Leitung. Habe folgende Tabelle (Beispiel):
Bildnr. Schlagwort
5 Kirche
8 Kunst
8 Kirche
12 Kirche
17 Kunst
Wie bekomme ich mit SQL die Datensätze mit gleicher Bildnummer? Sind natürlich
mehrere Einträge mit doppelter Bildnummer.
Danke
Falk
Hi Falk,
Wie bekomme ich mit SQL die Datensätze mit gleicher Bildnummer?
Sind natürlich mehrere Einträge mit doppelter Bildnummer.
das kommt ein wenig darauf an, was Du unter "mit SQL" verstehst.
Ich würde das nach Möglichkeit mit einem subselect lösen wollen,
was aber einige Datenbanken (u. a. mySQL) nicht können.
Was hast Du denn so zur Verfügung?
Viele Grüße
Michael
Hoi,
Wie bekomme ich mit SQL die Datensätze mit gleicher Bildnummer?
Sind natürlich mehrere Einträge mit doppelter Bildnummer.
das kommt ein wenig darauf an, was Du unter "mit SQL" verstehst.
Ich würde das nach Möglichkeit mit einem subselect lösen wollen,
was aber einige Datenbanken (u. a. mySQL) nicht können.
Ich glaube, hier ist die Fragestellung etwas unklar. Was meinst du mit
'wie bekomme ich mit SQL die Datensaetze mit gleicher Bildnummer'?
Willst du sie nach der Bildnummer sortiert haben? Oder willst du nur
die Datensaetze, die doppelt vorkommen?
Gruesse,
CK
Hallo,
also ich hab eine Möglichkeit gefunden über zwei Unterabfragen.
1. Select Bildnr, Schlagwort from tab where Schlagwort like "Kirche";
2. Select Bildnr, Schlagwort from tab where Schlagwort like "Kunst";
3. Select Abfrage2.Bildnr, Abfrage2.Schlagwort from Abfrage1, Abfrage2 where Abfrage1.Biildnr = Abfrage2.Bildnr;
Das liefert mir alle Datensätze wo die Bildnummer doppelt ist. Allerdings ist mir noch nicht klar wie ich das in ein Statement packen kann.
Ich benutze mysql. Habe die Abfragen aber unter Access ausprobiert.
Falk
Hoi,
also ich hab eine Möglichkeit gefunden über zwei Unterabfragen.
Pfui! ;-)
- Select Bildnr, Schlagwort from tab where Schlagwort like "Kirche";
- Select Bildnr, Schlagwort from tab where Schlagwort like "Kunst";
- Select Abfrage2.Bildnr, Abfrage2.Schlagwort from Abfrage1, Abfrage2 where Abfrage1.Biildnr = Abfrage2.Bildnr;
Das liefert mir alle Datensätze wo die Bildnummer doppelt ist.
Allerdings ist mir noch nicht klar wie ich das in ein Statement
packen kann.
Vielleicht so (ungetestet mangels RDBMS):
SELECT
b.bildnr,b.schlagwort
FROM
tab AS a
LEFT JOIN
tab AS b
ON
a.bildnr = b.bildnr
WHERE (
schlagwort
LIKE
"Kirche"
OR
schlagwort
LIKE
"Kunst")
AND
NOT ISNULL(b.bildnr)
Wie gesagt, das ist ungetestet und duerfte wohl auch eine
quadratische Performance-Einbusse bedeuten (== bei vielen n-fachen
Eintraegen ganz wenig Performance).
Gruesse,
CK
Hallo Christian,
SELECT
b.bildnr,b.schlagwort
FROM
tab AS a
LEFT JOIN
tab AS b
ON
a.bildnr = b.bildnr
WHERE (
schlagwort
LIKE
"Kirche"
OR
schlagwort
LIKE
"Kunst")
AND
NOT ISNULL(b.bildnr)
klappt leider nicht. Mir werden alle Datensätze mit Kirche und alle mit Kunst angezeigt, praktisch ein Duplikat der Ausgangstabelle.
Falk
Hi Falk
SELECT b.bildnr
FROM tab AS a
INNER JOIN tab AS b
ON (a.bildnr = b.bildnr
and b.schlagwort = 'Kirche')
WHERE a.schlagwort = 'Kunst'
Damit klappts hoffentlich (ungetestet mangels rdbms),
ist allerdings keine allgemeine Lösung, klappt nur mit
genau 2 (geändert auch mit mehreren, Performance würde
jedoch massiv leiden).
Wenn du eine alte Version von MySQL hast, dann
geht INNER JOIN noch nicht, dann müsstest du mit
LEFT (OUTER) JOIN arbeiten und die Records die
auf der b Seite keine Einträge haben (ISNULL(b.bildnr))
ausschliessen.
Wenn es dir nur darum geht, Einträge die mehrfach existieren
auszuschliessen kannst du damit arbeiten:
SELECT a.bildnr, count(*) as counti
FROM tab AS a
WHERE (a.stichwort in ('stichwort1', 'stichwort2', ..., 'stichwortN')
GROUP BY a.bildnr
HAVING counti > entweder anz Stichworte, od anz min Treffer mit den Stichworten
Gruss Daniela
Hallo Daniela,
SELECT b.bildnr
FROM tab AS a
INNER JOIN tab AS b
ON (a.bildnr = b.bildnr
and b.schlagwort = 'Kirche')
WHERE a.schlagwort = 'Kunst'
Es funktioniert ! :-) in mysql und auch in access.
Jetzt muß ichs nur noch verstehen :-)
Vielen Dank.
Falk
Hi Falk
SELECT b.bildnr
FROM tab AS a
INNER JOIN tab AS b
ON (a.bildnr = b.bildnr
and b.schlagwort = 'Kirche')
WHERE a.schlagwort = 'Kunst'
Es funktioniert ! :-) in mysql und auch in access.
Jetzt muß ichs nur noch verstehen :-)
Er nimmt eine Zeile aus der Tabelle a und fügt
eine Zeile aus Tabelle b hinzu, und zwar jeweils
die Zeilen, wo beide bildnr identisch sind (die on-clause).
Daraus filtert er dann alle raus, wo das Schlagwort nicht
Kunst ist, das b.schlagwort könntest du auch noch zum
where runternehmen, also a... = 'Kunst' and b... = 'Kirche'.
Der inner join im Vergleich zum left join bedeutet, das
sowohl die linke Seite (also Tabelle a), als auch die rechte
Seite (Tabelle b) vorhanden sein muss, bei left join muss nur
die linke Seite (Tabelle a) ein Eintrag haben.
Natürlich macht er das ganze nicht in der Reihenfolge
und optimiert das ganze noch ein ganzes Stück.
Gruss Daniela
Hi Daniela,
ich glaub jetzt ist's klar. Das mit dem Schlagwort in der FROM Klausel hatte ich nicht kapiert.
Nochmals danke
Falk
hi Falk,
wie wärs mit
SELECT DISTINCT *
FROM tabelle
WHERE bildnr IN (
SELECT bildnr
FROM tabelle
WHERE COUNT (bildnr) > 2
)
?? (habs nich getestet)
Dein Onkel
Hi Onkel
SELECT DISTINCT *
FROM tabelle
WHERE bildnr IN (
SELECT bildnr
FROM tabelle
WHERE COUNT (bildnr) > 2
)
Grundsätzlich mag das funktionieren (habs mir nicht weiter
angeschaut), aber, er arbeitet mit MySQL und MySQL beherrscht
keine Subselects. Deine Lösung läuft also nicht mit MySQL, in
IN darf da nur eine Liste aus Werten sein, keine Query.
Gruss Daniela
Hi Onkel :-),
SELECT DISTINCT *
FROM tabelle
WHERE bildnr IN (
SELECT bildnr
FROM tabelle
WHERE COUNT (bildnr) > 2
)
geht leider nicht.
Access z.B. bringt Fehler: Aggregatfunktion in WHERE-Klausel (COUNT(bildnr)>2)nicht möglich.
Falk