Necesito implementar la siguiente consulta en SQL Server:
select *
from table1
WHERE (CM_PLAN_ID,Individual_ID)
IN
(
Select CM_PLAN_ID, Individual_ID
From CRM_VCM_CURRENT_LEAD_STATUS
Where Lead_Key = :_Lead_Key
)
Pero la cláusula WHERE..IN permite solo 1 columna. ¿Cómo puedo comparar 2 o más columnas con otro SELECT interno?
sql-server
ala
fuente
fuente
Respuestas:
Puede hacer una tabla derivada de la subconsulta y unir table1 a esta tabla derivada:
fuente
En su lugar, querrá usar la sintaxis WHERE EXISTS.
fuente
ADVERTENCIA SOBRE SOLUCIONES:
MUCHAS SOLUCIONES EXISTENTES PROPORCIONARÁN LA SALIDA INCORRECTA SI LAS FILAS NO SON ÚNICAS
Si usted es la única persona que crea tablas, esto puede no ser relevante, pero varias soluciones le 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 DEL PROBLEMA:
CON MÚLTIPLES COLUMNAS NO EXISTE, PIENSA CUIDADOSAMENTE LO QUE QUIERES
Cuando veo una entrada con dos columnas, puedo imaginar que significa dos cosas:
El escenario 1 es bastante trivial, simplemente use dos declaraciones IN.
En línea con la mayoría de las respuestas existentes, por la presente proporciono una visión general de los enfoques mencionados y adicionales para el Escenario 2 (y un breve juicio):
EXISTE (Seguro, recomendado para SQL Server)
Según lo provisto por @mrdenny, EXISTS suena exactamente como lo que está buscando, aquí está su ejemplo:
IZQUIERDA SEMI UNIR (Seguro, recomendado para dialectos que lo soporten)
Esta es una forma muy concisa de unirse, pero desafortunadamente la mayoría de los dialectos de SQL, incluido el servidor SQL, actualmente no lo admiten.
Múltiples declaraciones IN (seguro, pero tenga cuidado con la duplicación de código)
Como mencionó @cataclysm, usar dos declaraciones IN también puede ser útil, 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, es un riesgo mayor que cree inconsistencias en su lógica.
Solución básica
Solución sin duplicación de código (creo que esto no funciona en consultas regulares de SQL Server)
UNIÓN INTERNA (técnicamente se puede hacer seguro, pero a menudo esto no se hace)
La razón por la que no recomiendo usar una unión interna como filtro es porque, en la práctica, las personas a menudo permiten que los duplicados en la tabla derecha causen duplicados en la tabla izquierda. Y para empeorar las cosas, a veces hacen que el resultado final sea distinto, mientras que la tabla de la izquierda en realidad puede no necesitar ser única (o no única en las columnas que seleccione). Además, le da la oportunidad de seleccionar realmente una columna que no existe en la tabla de la izquierda.
Errores más comunes:
CONCATENACIÓN DE COLUMNAS CON SEPARADOR (No muy seguro, rendimiento horrible)
El problema funcional es que si usa un separador que puede aparecer en una columna, se vuelve difícil 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 completamente los índices, lo que resulta en un rendimiento posiblemente horrible. A pesar de estos problemas, tengo que admitir que a veces todavía lo uso para consultas ad-hoc en pequeños conjuntos de datos.
Tenga en cuenta que si sus columnas son numéricas, algunos dialectos SQL requerirán que los convierta primero en cadenas. Creo que el servidor SQL hará esto automáticamente.
Para concluir: Como es habitual, hay muchas maneras de hacer esto en SQL, usar opciones seguras evitará sorpresas y le ahorrará tiempo y dolores de cabeza a largo plazo.
fuente
Nota:
Oracle ignora las filas donde una o más de las columnas seleccionadas son NULL. En estos casos, es probable que desee hacer uso de la NVL -Funktion para asignar NULL a un valor especial (que no debería ser en los valores);
fuente
where (colA,colB) in (... some list of tuples...)
pero no estoy seguro de qué otras bases de datos hacen lo mismo. Me interesaría saberlo.Una simple cláusula EXISTS es más limpia
Si tiene varias filas en la correlación, entonces JOIN proporciona varias filas en la salida, por lo que necesitaría distintas. Lo que generalmente hace que los EXISTS sean más eficientes.
La nota
SELECT *
con JOIN también incluiría columnas de las tablas de limitación de filasfuente
¿Por qué usar WHERE EXISTS o DERIVED TABLES cuando puedes hacer una unión interna normal?
Si el par de (CM_PLAN_ID, Individual_ID) no es único en la tabla de estado, es posible que necesite un SELECT DISTINCT t. * En su lugar.
fuente
1.Uso con
EXISTS
[Tiempo promedio de consulta: 1.42s]2.Uso con dos líneas
IN
Cláusula [Tiempo promedio de consulta: 0.37s]3.Utilizando con
INNNER JOIN
patrón [Tiempo promedio de consulta: 2.9s]Entonces, elegí la segunda opción.
fuente
AND
declaraciones en lugar deOR
declaraciones.OR
declaración probablemente genere duplicaciones. En mi caso, no hay filas que contengan lo mismosrc_id
ydest_id
en una sola fila. Entonces, las duplicaciones no sucederán en mi caso.Consulta:
la consulta anterior funcionó para mí en mysql. consulte el siguiente enlace ->
https://www.w3resource.com/sql/subqueries/multiplee-row-column-subqueries.php
fuente
Si desea una tabla, use la siguiente consulta
y datos de la tabla de la siguiente manera
Luego salida como sigue
fuente
id in (1,2) and studentName in ('a','b')
es totalmente no el mismo que(id, studentName) in ((1,'a'),(2,'b'))
. Solo piense en un registro que tenga id = 2 y name = 'a'. Por supuesto, si la ID es única, entonces el efecto disminuye, pero luego, si la ID es única, no necesitamos filtrar los nombres en absoluto.Simplemente podemos hacer esto.
fuente
Concatenar las columnas juntas de alguna forma es un "truco", pero cuando el producto no admite semiuniones para más de una columna, a veces no tiene otra opción.
Ejemplo de dónde la solución de unión interna / externa no funcionaría:
Cuando las consultas no son triviales por naturaleza, a veces no tiene acceso a la tabla base configurada para realizar uniones internas / externas regulares.
Si utiliza este "pirateo", cuando combine campos, asegúrese de agregar suficiente delimitador entre ellos para evitar interpretaciones erróneas, p. Ej.
ColA + ":-:" + ColB
fuente
Funcioné más fácil de esta manera
Espero que esto ayude :)
fuente
CM_PLAN_ID = 45
yIndividual_ID = 3
luego la concatenación resulta453
, lo cual es indistinguible del caso dondeCM_PLAN_ID = 4
yIndividual_ID = 53
... pidiendo problemas, habría pensado45_3
o45:3
pero todavía no es una buena solución y, por supuesto, como @mrdenny dice que los índices no se utilizarán ahora que se ha producido una transformación en las columnas.La forma simple e incorrecta sería combinar dos columnas usando + o concatenar y hacer una columna.
Esto sería, por supuesto, bastante lento. No se puede usar en la programación, pero si está en el caso de que solo esté buscando verificar, se puede usar algo.
fuente