# SQL Teilmenge anziehen



## fuzzycontrol (21. Feb 2012)

Hallo liebes Forum,

ich habe folgendes SQL-Problem:

Ich habe eine Table test mit einer Spalte id
Dort stehen nacheinander Einträge drin, also z.b. (1,2,3,5,6,8,9)
Es fehlen also zwischendurch Einträge.
Welche da fehlen, muss ich herausbekommen. Ich weiß das die "komplette" Menge z.B. so aussieht (1,2,3,4,5,6,7,8,9) 

Rein naiv würde ich die SQL so bauen:
Select id from test
where (1,2,3,4,5,6,7,8,9) not in id

Geht natürlich nicht drückt aber ganz gut aus was ich brauche

Als Ergebnismenge sollte dann in diesem Beispiel rauskommen:
(4,7)


----------



## tfa (21. Feb 2012)

Select id from test
where id not in  (1,2,3,4,5,6,7,8,9)


----------



## fuzzycontrol (21. Feb 2012)

war natürlich auch mein erster gedanke, aber das liefert nur ein leeres Ergebnis, weil ja die Menge in id per Definition eine Teilmenge von der Menge in () ist


----------



## Gast2 (21. Feb 2012)

Sequence gaps in MySQL


----------



## parabool (21. Feb 2012)

Wenn eine (Nachschlage) Tabelle angelegt wird, wo alle möglichen id's verzeichnet sind,
würde folgendes gehen:


```
SELECT id FROM lockup_table where id not in (select id from test) ;
```


----------



## fuzzycontrol (21. Feb 2012)

danke für die Antworten leider ist da noch nicht was praktikables dabei.

Die Nachschlage-Menge muss keine durchgehende Sequenz sein, sondern kann z.B. auch Strings bestehen.

Aus der Nachschlage-Menge eine Tabelle zu machen wird schwierig, weil es in einem Statement passieren muss.

So wie es aussieht gibts wohl doch keine "elegante" Lösung. Schade.


----------



## Gast2 (21. Feb 2012)

fuzzycontrol hat gesagt.:


> Die Nachschlage-Menge muss keine durchgehende Sequenz sein, sondern kann z.B. auch Strings bestehen.



Was soll das heißen? Also es ist keine int-Reihe sondern es können z.B. auch Straßennamen sein? Wie soll man da fehlende finden wenn man nicht weiß was im vollen Set ist?


----------



## fuzzycontrol (21. Feb 2012)

fassy hat gesagt.:


> Was soll das heißen? Also es ist keine int-Reihe sondern es können z.B. auch Straßennamen sein? Wie soll man da fehlende finden wenn man nicht weiß was im vollen Set ist?


Das volle Set (Nachschlage-Menge) wird manuell generiert (durch eine Java-Prozedur oder per Hand einfach eine Liste geschrieben)


----------



## fuzzycontrol (21. Feb 2012)

Also ich hab eine Liste in der Tabelle die potientiell unvollständig ist und eine vollständige Liste "im Kopf" und ich suche nun die Entries aus der vollständigen Liste die nicht mit in der Tabelle stehen


----------



## fuzzycontrol (21. Feb 2012)

nochmal anders formuliert in Pseudo-SQL

select * from (1,2,3,4,5,6,7,8,9,undnochmehr) as vollstaendigeListe 
MINUS
select * from test


----------



## parabool (22. Feb 2012)

Auf Teufel komm raus: 

```
SELECT lookup.id from (SELEKT 1 as id union selekt 2 as id union selekt 3 as id) as lookup where id not in (SELECT id  FROM test);
```
Du musst die selects die per union die Lookup-Table bilden, programmatisch generieren.

(Select mit k weil sonst Beitrag nicht abgeschickt wurde *verwirrt*)


----------



## Gast2 (22. Feb 2012)

Um welches RDBMS geht es? In Oracle könnte man mit PLSQL Tables arbeiten und das ganze als Block in der Datenbank laufen lassen. Wird denke ich mal so auch in anderen RDBMS gehen, dann ist allerdings die Syntax entscheidend...


----------



## parabool (22. Feb 2012)

Um bei den Bsp. der kompletten Menge von 1 bis 9 zu bleiben:

```
(selekt 1 AS id UNION selekt 2 AS id UNION selekt 3 AS id ...usw... UNION selekt 9 AS id)
```

wird natürlich bei grossen Mengen...ging nur um Machbarkeit.


----------

