Pregunta

Esto me ha estado volviendo loco en los últimos minutos

Tengo una tabla, digamos table_alphabet con tres columnas.

letter(pri)  col1   col2   
a            24     55
b            45     45
c            23     44
...
y            33     55
z            45     22 

Ahora en mi aplicación tengo una lista ( 'a', 'b', 'lol', 'Cats', 'z', 'foo').

Si lo hago

SELECT letter FROM table_alphabet WHERE letter IN ('a', 'b', 'lol', 'cats', 'z', 'foo')

consigo solamente las filas, (a, b, z)

Lo que quiero es sin embargo para conseguir 'lol', 'Cats', 'foo'. O en Inglés, lo que los elementos en mi lista faltan en la tabla.

Cualquier ayuda se agradece, me parece estar teniendo un mal funcionamiento del cerebro en la actualidad.

¿Fue útil?

Solución

El NO EN comando funcionará incluso con una lista no estática que está filtrando en contra. Se puede utilizar una sub-consulta como:

select letter from table_alphabet where letter NOT IN ( select letter from exclude_table )

Otros consejos

Puede que sea completamente fuera de base, pero no creo que se va a lograr que en tan sólo SQL solo.

Ahora, si ha cargado su lista en una tabla, lo llaman table_list, la izquierda y luego unirse a su table_alphabet y excluir todas las filas en las que el alfabeto es nulo, entonces podría obtener su lista de exclusiones.

En este momento, estoy totalmente leído mal la pregunta primera vez a través. Usted necesitará una subconsulta que puede tirar todas las cartas en su lista como filas. La única manera que puedo pensar en hacer esto es mediante la unificante a todos juntos:

select let from (select 'a' as let union select 'b' as let union select 'lol' as let union select 'cats' as let union select 'z' as let union select 'foo' as let) as innerletters where let not in (select letter from table_alphabet);

Así, en otras palabras, su aplicación tendrá que tomar la lista "('a', 'b', 'lol', 'cats', 'z', 'foo')" y volver a escribir en una unión:

(select 'a' as let union select 'b' as let union select 'lol' as let union select 'cats' as let union select 'z' as let union select 'foo' as let)

... e insertar que en la consulta. Esto debería devolver las cartas de la lista que no están presentes en la columna de la letra de la tabla table_alphabet:

+------+
| let  |
+------+
| lol  |
| cats |
| z    |
| foo  |
+------+
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top