2012-05-22 5 views
17

Vamos a suponer lo siguiente:Crear una tabla de SQL en línea sobre la marcha (para una exclusión de izquierda unirse a)

Tabla A

id | value 
---------- 
1 | red 
2 | orange 
5 | yellow 
10 | green 
11 | blue 
12 | indigo 
20 | violet 

tengo una lista de identificadores (10, 11, 12, 13 , 14) que se puede usar para buscar identificadores en esta tabla. Esta lista de identificadores se genera en mi interfaz.

Al usar SQL puramente, necesito seleccionar los identificadores de esta lista (10, 11, 12, 13, 14) que no tienen entradas en la Tabla A (se unen en la columna 'id'). El resultado debería ser el resultado de los identificadores 13 y 14.

¿Cómo puedo lograr esto usando solo SQL? (Además, me gustaría evitar el uso de un procedimiento almacenado si es posible)

El único enfoque que puedo pensar es algo que crearía una tabla SQL en línea sobre la marcha para mantener temporalmente mi lista de id. Sin embargo, no tengo idea de cómo hacer esto. es posible? ¿Hay una mejor manera?

Gracias! :)

+0

Esto no es muy clara. Si sus ID no están en otra tabla, no hay nada a lo que unirse. – Cfreak

+0

Exactamente. :) ¡Ahí yace el problema! – rinogo

+0

¿Qué pasa con 'NOT IN ()'? – Cfreak

Respuesta

18

puede crear una "mesa en línea" con una subconsulta UNION:

(
      SELECT 10 AS id 
    UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 
    -- etc. 
) AS inline_table 
+0

¿Será esto un problema si mi lista es de unos cientos de artículos (en lugar de 5 elementos como en la pregunta)? – rinogo

+0

@rinogo: Bueno, haría que tu consulta sea bastante larga (lo que puede llevar un tiempo analizar), pero no estoy al tanto de ningún problema inherente que pueda causar. – eggyal

+2

@rinogo: con listas realmente grandes puede presionar el límite 'max_allowed_packet' que no le permitirá enviar la consulta, aunque requiere cientos de miles de registros con la configuración predeterminada. – Quassnoi

5
CREATE TEMPORARY TABLE ids (id INT NOT NULL PRIMARY KEY); 

INSERT 
INTO ids 
VALUES 
(10), 
(11), 
(12), 
(13), 
(14); 

SELECT * 
FROM ids 
WHERE id NOT IN 
     (
     SELECT id 
     FROM a 
     ); 
+0

, pero ¡no funcionaría para consultas paralelas! –

+0

@mortezakavakebi: ¿qué quieres decir? – Quassnoi

+0

crear una tabla no es una base de sesión. cuando diferentes usuarios llaman a una url que contiene esta consulta, crea un conflicto en la tabla "ids". –

33

Usted puede hacer esto a partir de SQL Server 2008 en adelante el uso de un valor de la tabla constructor.

SELECT * FROM (
    VALUES(1, 'red'), 
     (2, 'orange'), 
     (5, 'yellow'), 
     (10, 'green'), 
     (11, 'blue'), 
     (12, 'indigo'), 
     (20, 'violet')) 
    AS Colors(Id, Value) 

Más información aquí: Table Value Constructor

+5

Desafortunadamente, esta pregunta está etiquetada con 'mysql', no' sql-server'. – trincot

+3

Afortunadamente para mí, todavía hice clic en él y encontré esto – Jonesopolis

Cuestiones relacionadas