Probleme mit "IN"

freichle

Grünschnabel
Hi,

ich benutze eine SQL Abfrage mit IN, um nur bestimmte Werte in meinem Ergebnisse zu erhalten.
Code:
SELECT * FROM Tabelle WHERE Feld1 IN (SELECT DISTINCT Feld1 FROM test WHERE Feld2 = 1234) ORDER BY Feld1 ;

Ziel ist mit dem Distinct Befehle gleiche Daten zu elimieren in der Abhängikeit von Feld2. Um alle Spalten zu bekommen arbeite ich mit "*", sonst würde ich eifnach Spalte und Distinct machen.
Allerdings holt er bei der Abfragen immer noch doppelte Werte im Feld1; was mache ich falsch?

Als DB verwende ich PostgreSQL
 
Hallo,

der SQL filtert im SubSelect die doppelten Datensätze (Feld1 mit Bedingung Feld2 = 1234) aber nicht in deiner Hauptabfrage, dort willst du doch die doppelten Datensätze eliminieren.

Code:
 SELECT DISTINCT  * FROM Tabelle WHERE Feld1 IN (SELECT DISTINCT Feld1 FROM test WHERE Feld2 = 1234) ORDER BY Feld1 ;
 
Ja in der Hauptabfrage sollen doppelte Einträge verschwinden, deswegen mache ich die Sache ja mit "IN" damit nur der Datensatz aus der Unterabfrage verwendet wird.

Was ist bei mir der Fehler und wie behebe ich das ganze?
 
Hallo,

ob du im SubSelect einen Wert von Feld1 doppelt hast oder nicht, ist für den IN-Operator egal, dadurch bekommst du keine doppelten Datensätze. Es macht es nur für dich etwas übersichtlicher, wenn du den nur Subselect ausführst.

Deshalb gehört das DISTINCT auch in die Hauptabfrage, im SubSelect kann es bleiben.
Code:
SELECT DISTINCT  * FROM Tabelle WHERE Feld1 IN (SELECT DISTINCT Feld1 FROM test WHERE Feld2 = 1234) ORDER BY Feld1 ;
 
Das Problem ist, das doppelte Werte nur in Feld1 vorkommen und bei mir trotz Distinct in der Hauptabfrage dort immer noch doppelte Einträge vorkommen.
 
Hallo,

das DISTINCT filtert nur doppelte Datensätze, wenn du Select * machst, müssen alle Felder gleich sein, damit der Datensatz nur einmal angezeigt wird.

Poste doch mal ein paar Beispieldaten.
 
Beispiel Tabelle:

Feld1 Feld2 Feld3 Feld4
1 | 1234 | eins | dsfdf
2 | 1233 | eins | sdfdsf
3 | 1233 | zwei | sdfsdf
4 | 1243 | drei | fsdf
5 | 1232 | vier | sdfdsf
6 | 1231 | vier | sfddsf
7 | 1231 | vier | sfdsadsf
8 | 1231 | fünf | awesadsf

Ausgabe:

Feld2 COUNT
1234 | 1
1233 | 1
1132 | 1
1243 | 1
1232 | 1
1231 | 2

Das sind nur Beispieldaten, aber ich hoffe damit wird mein Problem verständlich. Ich will nur die gleichen Daten in Feld2 zählen, aber unter der Vorrausetzung das sich die Werte in Feld3 nicht gleichen( siehe Beispiel 1233 und 1231).
 
Zuletzt bearbeitet:
Hallo,

dann meinst du so:
Code:
SELECT     Feld2, Anzahl
FROM         (SELECT DISTINCT Feld2, Feld3, COUNT(*) AS Anzahl
                       FROM          Tabelle
                       GROUP BY Feld2, Feld3) T1
GROUP BY Feld2, Anzahl
Feld2 Anzahl
1231 1
1231 2
1232 1
1233 1
1234 1
1243 1

oder so:
Code:
SELECT     Feld2, Feld3, Anzahl
FROM         (SELECT DISTINCT Feld2, Feld3, COUNT(*) AS Anzahl
                       FROM          Tabelle
                       GROUP BY Feld2, Feld3) T1
GROUP BY Feld2, Anzahl, Feld3
Feld2 Anz Feld3
1243 1 drei
1233 1 eins
1234 1 eins
1231 1 fünf
1231 2 vier
1232 1 vier
1233 1 zwei
 
Zurück