Meine Damen und Herren
https://de.wikibooks.org/wiki/Relationenalgebra_und_SQL:_Differenz
Ich habe schon eine Lösung für das Problem gefunden. Die Differenzmenge - in MySQL:
SELECT * FROM r
EXCEPT
SELECT * FROM s
Ich habe doch neulich gesagt, eigentlich müsste man Mengen verknüpfen können, wie in der Booleschen Algebra. Also, Wahrheitstablle
c b a y
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
Das ist mit AND und ODER ja schon gelungen - INTERSECT und UNION. Jetzt war die Frage, nach dem NICHT
NICHT a müsste jedes Element sein - außer, die Elemente, die in a sind - aber, was ist jedes Element. Na ja, die Frage, stellt sich nach unserer Menge.
Und die Antwort lautet: Die Menge ist unendlich groß. Bei Zahlen 32 Bit 4.000.000.000+ Oder: Bei VARCHAR (256) und das ist ein kleiner Text, undenkbar.
Ist es die leere Menge? Kann auch nicht sein.
Dann bin ich auf die Lösung gekommen - was unsere Menge ist. Mathematisch ist das
a x b x c
A x B x C
Das ist das Kreuzprodukt. Die Menge ist nicht etwa, die Menge, der möglichen Elemente - sondern, die vorhandene Menge A x B x C sind ja gefüllt, also das Kreuzprodukt.
Jetzt das nicht, das sind alle
A x B x C
ohne A. Da ohne A, könnte man auch schreiben
B x C
Jetzt gibt es ein Problem. In B x C können Elemente auch in A sein. Also, brauchen wir eine Differenzmenge
B x C schreibt man in MySQL mit
SELECT x FROM (SELECT x FROM b UNION SELECT x FROM c)x ORDER BY x
Jetzt die Differenzmenge ist EXCEPT. Also müssen wir schreiben
(B x C)\A
SELECT x FROM(
SELECT x FROM (
SELECT x FROM b
UNION
SELECT x FROM c
)x
EXCEPT
SELECT x FROM a
)x ORDER BY x