Selektion nicht vorhandener Werte

TimoTH

Mitglied
Hallo,
ich habe eine Tabelle mit numerischen Einträgen. Ich suche nun eine Möglichkeit, alle Werte zu selektieren, die nicht in der Tabelle vorhanden sind und in einem bestimmten Intervall liegen. D.h. wenn die Tabelle in einer Spalte die Werte "1,3,4" enthält und ich im Intervall [1,5] suche, sollten die Werte 2 und 5 gefunden werden.

Ich finde leider überhaupt keinen Ansatz. Vielleicht hat ja jemand eine Idee.

PS: Ich habe hier verschiedenste DBMS im Einsatz. Eine allgemeingültige Lösung wäre daher toll, aber ich nehme was ich kriegen kann :)


Danke und Gruß!
Timo
 
Ist das eine Zeile mit dem String "1,3,4" oder sind das 3 Zeilen mit jeweils 1,3 oder 4 als Feldeintrag?

key
1,3,4
oder
key
1
3
4
 
Das Problem ist, dass du Zeilen generieren musst. Das geht je nach DB verschieden. In Oracle gibts glaub ein Befehl - ich weiss ihn aber grad nicht mehr auswendig.
In den meisten Fällen geht es über das folgnede Konstrukt:
SQL:
-- 400 Zeilen: 5x5x4x4
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) AS d1,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) AS d2,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) AS d3,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) AS d4
Siehe auch http://stackoverflow.com/questions/304461/generate-an-integer-sequence-in-mysql

Darauf eine Zeilenummerierung schmiessen, dieser mit LEFT JOIN die Tabelle antackern und prüfen welche Einträge fehlen.
Dann nach dem Intervall mit BETWEEN angeben - fertig

Ein Beispiel mit MySQL:
SQL:
SELECT
	nums.rownum
FROM
	-- Einfach mal eine grosse Liste mit vielen Zahlen erstellen
	(
		SELECT 
			-- Zeilennummeriering ist je nach DBMS anderst
			@rownum := @rownum+1 AS rownum
		FROM
			-- Anstelle von 0 kann man als Start der Zeilenummerierung
			-- auch die Sequenzuntergrenze-1 verwenden
			-- also bei einer Sequenz [4,10] währe der Start bei 3
			(SELECT @rownum:=0) AS vars,
			-- mal genug Zeilen zur Verfügung stellen
			(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) AS d1,
			(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) AS d2,
			(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) AS d3,
			(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) AS d4	
	) AS nums
	-- Diese mit der Tabelle verknüpfen
	LEFT JOIN test
		ON test.id = nums.rownum
WHERE
	-- nur die nehmen dies in test nicht gibt
	test.id is null
	-- und noch den Range angeben
	AND nums.rownum BETWEEN 1 AND 10
 
Zuletzt bearbeitet von einem Moderator:
Danke für deine Antwort.

Werde das bei mir mal in verschiedenen Konstellationen testen. Eventuell muss ich mich auch damit anfreunden, die nicht vorhandenen Werte über die Anwendungslogik ermitteln zu lassen.

Danke und Gruß!
Timo
 
Zurück