Saltar al contenido

SQL WHERE .. IN cláusula múltiples columnas

Solución:

En su lugar, querrá usar la sintaxis WHERE EXISTS.

SELECT *
FROM table1
WHERE EXISTS (SELECT *
              FROM table2
              WHERE Lead_Key = @Lead_Key
                        AND table1.CM_PLAN_ID = table2.CM_PLAN_ID
                        AND table1.Individual_ID = table2.Individual_ID)

Puede crear una tabla derivada a partir de la subconsulta y unir table1 a esta tabla derivada:

select * from table1 LEFT JOIN 
(
   Select CM_PLAN_ID, Individual_ID
   From CRM_VCM_CURRENT_LEAD_STATUS
   Where Lead_Key = :_Lead_Key
) table2
ON 
   table1.CM_PLAN_ID=table2.CM_PLAN_ID
   AND table1.Individual=table2.Individual
WHERE table2.CM_PLAN_ID IS NOT NULL

ADVERTENCIA SOBRE SOLUCIONES:

MUCHAS SOLUCIONES EXISTENTES DARÁN EL RESULTADO EQUIVOCADO SI LAS FILAS NO SON ÚNICAS

Si es la única persona que crea tablas, esto puede no ser relevante, pero varias soluciones darán un número diferente de filas de salida del código en cuestión, cuando una de las tablas puede no contener filas únicas.

ADVERTENCIA SOBRE LA DECLARACIÓN DE PROBLEMA:

EN CON MÚLTIPLES COLUMNAS NO EXISTE, PIENSA CUIDADOSAMENTE LO QUE QUIERES

Cuando veo una entrada con dos columnas, puedo imaginar que significa dos cosas:

  1. El valor de la columna ay la columna b aparecen en la otra tabla de forma independiente
  2. Los valores de la columna ay la columna b aparecen en la otra tabla juntos en la misma fila

El escenario 1 es bastante trivial, simplemente use dos declaraciones IN.

De acuerdo con la mayoría de las respuestas existentes, por la presente proporciono una descripción general de los enfoques mencionados y adicionales para el Escenario 2 (y un breve juicio):

EXISTS (Seguro, recomendado para SQL Server)

Según lo proporcionado por @mrdenny, EXISTS suena exactamente como lo que está buscando, aquí está su ejemplo:

SELECT * FROM T1
WHERE EXISTS
(SELECT * FROM T2 
 WHERE T1.a=T2.a and T1.b=T2.b)

LEFT SEMI JOIN (Seguro, recomendado para dialectos que lo soportan)

Esta es una forma muy concisa de unirse, pero desafortunadamente la mayoría de los dialectos SQL, incluido el servidor SQL, no lo admiten actualmente.

SELECT * FROM T1
LEFT SEMI JOIN T2 ON T1.a=T2.a and T1.b=T2.b

Múltiples declaraciones IN (seguro, pero tenga cuidado con la duplicación de código)

Como lo menciona @cataclysm, el uso de dos declaraciones IN también puede hacer el truco, tal vez incluso supere a las otras soluciones. Sin embargo, debe tener mucho cuidado con la duplicación de código. Si alguna vez desea seleccionar de una tabla diferente o cambiar la instrucción where, existe un mayor riesgo de que cree inconsistencias en su lógica.

Solucion basica

SELECT * from T1
WHERE a IN (SELECT a FROM T2 WHERE something)
AND b IN (SELECT b FROM T2 WHERE something)

Solución sin duplicación de código (creo que esto no funciona en consultas regulares de SQL Server)

WITH mytmp AS (SELECT a, b FROM T2 WHERE something);
SELECT * from T1 
WHERE a IN (SELECT a FROM mytmp)
AND b IN (SELECT b FROM mytmp)

INNER JOIN (técnicamente se puede hacer seguro, pero a menudo esto no se hace)

La razón por la que no recomiendo usar una combinación interna como filtro es porque, en la práctica, las personas a menudo permiten que los duplicados en la tabla de la derecha causen duplicados en la tabla de la izquierda. Y luego, para empeorar las cosas, a veces hacen que el resultado final sea distinto, mientras que es posible que la tabla de la izquierda en realidad no necesite ser única (o no única en las columnas que seleccione). Además, le da la oportunidad de seleccionar una columna que no existe en la tabla de la izquierda.

SELECT T1.* FROM T1
INNER JOIN 
(SELECT DISTINCT a, b FROM T2) AS T2sub
ON T1.a=T2sub.a AND T1.b=T2sub.b

Errores más comunes:

  1. Unirse directamente en T2, sin una subconsulta segura. Dando como resultado el riesgo de duplicación)
  2. SELECT * (Guaranateed para obtener columnas de T2)
  3. SELECCIONAR c (No garantiza que su columna venga y siempre vendrá de T1)
  4. No DISTINCT o DISTINCT en el lugar equivocado

CONCATENACIÓN DE COLUMNAS CON SEPARADOR (No muy seguro, rendimiento horrible)

El problema funcional es que si usa un separador que podría ocurrir en una columna, es complicado asegurarse de que el resultado sea 100% exacto. El problema técnico es que este método a menudo incurre en conversiones de tipos e ignora por completo los índices, lo que resulta en un rendimiento posiblemente horrible. A pesar de estos problemas, debo admitir que a veces todavía lo uso para consultas ad-hoc en pequeños conjuntos de datos.

SELECT * FROM T1
WHERE CONCAT(a,"_",b) IN 
(SELECT CONCAT(a,"_",b) FROM T2)

Tenga en cuenta que si sus columnas son numéricas, algunos dialectos SQL requerirán que las convierta primero en cadenas. Creo que el servidor SQL hará esto automáticamente.


Para resumir: Como de costumbre, hay muchas formas de hacer esto en SQL, el uso de opciones seguras evitará sorpresas y le ahorrará tiempo y dolores de cabeza a largo plazo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *