SELECT-Abfrage - Habe ein Brett vorm Kopf :-)

Hallo,

folgende Tabelle:

b|n

A|1
A|2
A|3
B|1
B|2
C|2
C|3
D|1
D|3

Es sollen alle Buchstaben (Spalte b) ausgegeben werden, den die Nummern 1 UND 3 (Spalte n) zugewiesen sind. Die Abfrage soll also als Ergebnis liefern: A, D.

SELECT * FROM t WHERE n = 1 AND n = 3
Geht natürlich nicht, denn n kann nicht gleichzeitig 1 und 3 sein. Wie macht man es also?

Hallo Fragewurm,

Dein Fehler steckt schon in der deutschen Formulierung:

Es sollen alle Buchstaben (Spalte b) ausgegeben werden, den
die Nummern 1 UND ODER 3 (Spalte n) zugewiesen sind. Die Abfrage
soll also als Ergebnis liefern: A, D.

SELECT * FROM t WHERE n = 1 AND OR n = 3
Geht natürlich nicht, denn n kann nicht gleichzeitig 1 und 3
sein. Wie macht man es also?

MfG Peter(TOO)

Hallo,

Es sollen alle Buchstaben (Spalte b) ausgegeben werden, den
die Nummern 1 UND 3 (Spalte n) zugewiesen sind.

ich denke, du meinst etwas in der Art:

(select b from t where n = 1)
intersect
(select b from t where n = 3)

Andreas

Hi,

ich denke, du meinst etwas in der Art:

Nö. Dieser Select würde immer eine leere Ergebnismenge leiefern.

(select b from t where n = 1)
intersect
(select b from t where n = 3)

Die Frage war schon beantwortet: OR ist richtig.

Gruß

Sancho

Hi,

Dieser Select würde immer eine leere Ergebnismenge liefern.

(select b from t where n = 1)
intersect
(select b from t where n = 3)

wie kommst du zu der Behauptung? Der erste Teil liefert alle Buchstaben, die mit einer 1 kombiniert sind, der zweite alle, die mit einer 3 kombiniert sind. Die Schnittmenge besteht dann aus allen Buchstaben, die sowohl mit 1 als auch mit 3 kombiniert sind.

Die Frage war schon beantwortet: OR ist richtig.

Nein, die Antwort mit dem OR liefert nicht das, was der Fragesteller mutmaßlich im Sinn hatte. Für seine Beispieldaten ergibt sich eine umfangreichere Lösungsmenge als das gewünschte {A, D}.

Andreas

Args!

wie kommst du zu der Behauptung? Der erste Teil liefert alle
Buchstaben, die mit einer 1 kombiniert sind, der zweite alle,
die mit einer 3 kombiniert sind. Die Schnittmenge besteht dann
aus allen Buchstaben, die sowohl mit 1 als auch mit 3
kombiniert sind.

Stimmt, zu schnell gelesen. Behaupte das Gegenteil :smile:

Gruß

Sancho

Hallo Peter,

Dein Fehler steckt schon in der deutschen Formulierung:

Es sollen alle Buchstaben (Spalte b) ausgegeben werden, den
die Nummern 1 UND ODER 3 (Spalte n) zugewiesen sind. Die Abfrage
soll also als Ergebnis liefern: A, D.

die (Um)Interpretation kann nicht stimmen; dann käme als Ergebnis nämlich A, B, C, D heraus.

Ich denke, der Fragesteller möchte alle Buchstaben, die (in verschiedenen Tupeln!) mit den Zahlen 1 und 3 kombiniert vorkommen.

Andreas

Hallo Andreas,

Dein Fehler steckt schon in der deutschen Formulierung:

Es sollen alle Buchstaben (Spalte b) ausgegeben werden, den
die Nummern 1 UND ODER 3 (Spalte n) zugewiesen sind. Die Abfrage
soll also als Ergebnis liefern: A, D.

die (Um)Interpretation kann nicht stimmen; dann käme als
Ergebnis nämlich A, B, C, D heraus.

Ich denke, der Fragesteller möchte alle Buchstaben, die (in
verschiedenen Tupeln!) mit den Zahlen 1 und
3 kombiniert vorkommen.

Das Problem ist, dass der Vergleich Zeilenweise gemacht wird.

Es muss mit OR zuerst eine neue Liste generiert werden.

Dann müssen alle Werte welche in Spalte b mehrfach vorkommen selektiert werden.

MfG Peter(TOO)

Hallo Andreas, Sancho,

ich nutze MySQL und INTERSECT wird hier nicht unterstützt - gibt es da eine äquivalente Anweisung? Die Verknüpfung OR liefert völlig andere Ergebnisse als gewollt und ist deshalb keine Lösung.

Hallo Peter,

Die Aufgabe, insbesondere das Wunschergebnis waren schon korrekt.

Die Verknüpfung OR liefert völlig andere Ergebnisse als gewollt und ist deshalb keine Lösung.

Inzwischen habe ich eine raffinierte Lösung gefunden, die doch mit der Verknüpfung OR funktioniert, jedoch die Elemente nach Buchstaben gruppiert und Elemente in jeder Gruppe zählt. Da ich genau zwei Kriterien habe, kann ich die Gruppen ausgeben, die genau zwei Elemente enthalten.

SELECT * FROM
(SELECT b, COUNT(n) AS cnt FROM test WHERE n = 1 OR n = 3 GROUP BY b) AS cnt_result
WHERE cnt = 2

Zwar funktioniert es richtig aber sieht leicht nach einer Bastellösung aus. Gibt es da vielleicht eine elegantere Methode?

Habe eine Bastellösung gefunden :smile: Siehe hier:
/t/select-abfrage-habe-ein-brett-vorm-kopf/5026003/10

Hi Multiplexor,

ich würde das über einen JOIN realisieren.

select \*
from Tabelle1 as T1 inner join Tabelle1 as T2
on ((T1.b = T2.b) and (T1.n = 1) and (T2.n = 3))

Gruß Mike

Mahlzeit,

Habe eine Bastellösung gefunden :smile: Siehe hier:
/t/select-abfrage-habe-ein-brett-vorm-kopf/5026003/10

der Joinansatz scheint verbreiteter zu sein: http://www.bitbybit.dk/carsten/blog/?p=71

Gruß

Sancho