2012-04-24 10 views
7

si escribo:Seleccione los valores de una tabla que no están en una lista de SQL

SELECT name FROM table WHERE name NOT IN ('Test1','Test2','Test3'); 

yo puede conseguir las entradas de la tabla que no están en la lista. Quiero hacer lo contrario: obtener los valores de la lista que no están en la tabla. Por ejemplo, si la tabla tiene una columna llamada name que tiene los valores 'Test1' y 'Test3', quiero comparar eso con ('Test1', 'Test2', 'Test3') y devolver Test2. O como otro ejemplo, si la tabla está vacía, devuelva todo en la lista: Test1, Test2 y Test3.

¿Hay alguna manera de hacerlo SIN crear una tabla nueva con todos los valores de la lista?

+0

Qué base de datos está usando (servidor SQL de Oracle??) – aquinas

+0

estoy usando sqlite3. – Trinculo

Respuesta

7

Dependiendo de la cantidad de valores que tenga, podría hacer algunos sindicatos.

Ver: http://www.sqlfiddle.com/#!5/0e42f/1

select * from (
    select 'Test 1' thename union 
    select 'Test 2' union 
    select 'Test 3' 
) 
where thename not in (select name from foo) 
+2

Nice sqlfiddle service – Anton

+2

Lo descubrí ayer. Es bastante resbaladizo. – aquinas

+0

Gracias aqunias, su solución funcionó bien. – Trinculo

0

Asumiendo "othertable" sostiene la tabla en cuestión ...

select a.value from 
    (select 'test1' value 
    union 
    select 'test2' value 
    union 
    select 'test3' value) a 
     left outer join othertable b 
     on a.value=b.value 
     where b.value is null 
1

lo general el uso SELECT 'FOO' AS COL UNION SELECT 'BAR' etc y luego usar el lenguaje estándar de la izquierda y la comprobación de unirse NULL para encontrar elementos faltantes.

CREATE TABLE #YourTable(
name nvarchar(50) 
) 

insert into #YourTable (name) values ('Test1'), ('Test3') 

-- ALL 
select * from #YourTable 

--MISSING 
select t1.* from (
    select 'Test1' testName 
    union select 'Test2' 
    union select 'Test3') as t1 
    left outer join #YourTable yt on t1.testName = yt.name 
    where yt.name is null 

DROP TABLE #YourTable 

Da salida

name 
-------------------------------------------------- 
Test1 
Test3 

(2 row(s) affected) 

testName 
-------- 
Test2 

(1 row(s) affected) 
1
Select a.value from (
SELECT 'testvalue' value UNION 
SELECT 'testvalue2' value UNION 
SELECT 'testvalue3' value UNION 
SELECT 'testvalue4' value UNION 
) a 
left outer join othertable b 
on a.value=b.value 
where b.value is null 

Esto es perfecto para mi problema sin tabla temporal #

Cuestiones relacionadas