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

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?

Puede crear una tabla derivada desde 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 

En su lugar, querrá usar la syntax 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) 

Una simple cláusula EXISTS es la más limpia

 select * from table1 t1 WHERE EXISTS ( Select * --or 1. No difference. From CRM_VCM_CURRENT_LEAD_STATUS Ex Where Lead_Key = :_Lead_Key -- correlation here AND t1.CM_PLAN_ID = Ex.CM_PLAN_ID AND t1.CM_PLAN_ID = Ex.Individual_ID ) 

Si tiene varias filas en la correlación, entonces JOIN da múltiples filas en la salida, por lo que necesitaría distintas. Lo que generalmente hace que los EXISTS sean más eficientes.

Nota “SELECT” * con un JOIN también incluiría columnas de las tablas de límite de fila

 select * from tab1 where (col1,col2) in (select col1,col2 from tab2) 

Nota:
Oracle ignora las filas donde una o más de las columnas seleccionadas es NULL. En estos casos, probablemente desee utilizar NVL-Funktion para asignar NULL a un valor especial (que no debería estar en los valores);

 select * from tab1 where (col1, NVL(col2, '---') in (select col1, NVL(col2, '---') from tab2) 

¿Por qué usar WHERE EXISTS o TABLAS DERIVADAS cuando puede hacer una combinación interna normal?

 SELECT t.* FROM table1 t INNER JOIN CRM_VCM_CURRENT_LEAD_STATUS s ON t.CM_PLAN_ID = s.CM_PLAN_ID AND t.Individual_ID = s.Individual_ID WHERE s.Lead_Key = :_Lead_Key 

Si el par de (CM_PLAN_ID, Individual_ID) no es único en la tabla de estado, es posible que necesite SELECCIONAR DISTINCT t *.

Si quieres una tabla, utiliza la siguiente consulta

 SELECT S.* FROM Student_info S INNER JOIN Student_info UT ON S.id = UT.id AND S.studentName = UT.studentName where S.id in (1,2) and S.studentName in ('a','b') 

y tabla de datos como sigue

 id|name|adde|city 1 a ad ca 2 b bd bd 3 a ad ad 4 b bd bd 5 c cd cd 

Entonces salida como sigue

 id|name|adde|city 1 a ad ca 2 b bd bd 

Consulta:

 select ord_num, agent_code, ord_date, ord_amount from orders where (agent_code, ord_amount) IN (SELECT agent_code, MIN(ord_amount) FROM orders GROUP BY agent_code); 

la consulta anterior funcionó para mí en mysql. consulte el siguiente enlace ->

https://www.w3resource.com/sql/subqueries/multiplee-row-column-subqueries.php

Concatenar las columnas juntas de alguna forma es un “truco”, pero cuando el producto no admite semicompuestas para más de una columna, a veces no tiene otra opción.

Ejemplo:

 select * from T1 where  and ( OR (ColA, ColB) in (select A, B ...)) and  ... 

Cuando las consultas no son de naturaleza trivial a veces no tiene acceso a la tabla base configurada para realizar uniones internas / externas regulares.

Si utilizas este “truco”, cuando combines los campos, asegúrate de agregar suficiente delimitador entre ellos para evitar interpretaciones erróneas, por ejemplo, ColA + ":-:" + ColB

 Postgres SQL : version 9.6 Total records on tables : mjr_agent = 145, mjr_transaction_item = 91800 

1.Using con EXISTS [Tiempo medio de consulta: 1.42s]

 SELECT count(txi.id) FROM mjr_transaction_item txi WHERE EXISTS ( SELECT 1 FROM mjr_agent agnt WHERE agnt.agent_group = 0 AND (txi.src_id = agnt.code OR txi.dest_id = agnt.code) ) 

2. Uso con dos líneas IN Cláusula [Tiempo medio de consulta: 0.37s]

 SELECT count(txi.id) FROM mjr_transaction_item txi WHERE txi.src_id IN ( SELECT agnt.code FROM mjr_agent agnt WHERE agnt.agent_group = 0 ) OR txi.dest_id IN ( SELECT agnt.code FROM mjr_agent agnt WHERE agnt.agent_group = 0 ) 

INNNER JOIN con el patrón INNNER JOIN [Promedio de tiempo de consulta: 2.9s]

 SELECT count(DISTINCT(txi.id)) FROM mjr_transaction_item txi INNER JOIN mjr_agent agnt ON agnt.code = txi.src_id OR agnt.code = txi.dest_id WHERE agnt.agent_group = 0 

Entonces, elegí la segunda opción.

Simplemente podemos hacer esto.

  select * from table1 t, CRM_VCM_CURRENT_LEAD_STATUS c WHERE t.CM_PLAN_ID = c.CRM_VCM_CURRENT_LEAD_STATUS and t.Individual_ID = c.Individual_ID 

Fundé más fácil de esta manera

 Select * from table1 WHERE (convert(VARCHAR,CM_PLAN_ID) + convert(VARCHAR,Individual_ID)) IN ( Select convert(VARCHAR,CM_PLAN_ID) + convert(VARCHAR,Individual_ID) From CRM_VCM_CURRENT_LEAD_STATUS Where Lead_Key = :_Lead_Key ) 

Espero que esto ayude 🙂

La manera simple e incorrecta sería combinar dos columnas usando + o concatenar y hacer una columna.

 Select * from XX where col1+col2 in (Select col1+col2 from YY) 

Esto sería bastante lento. No se puede utilizar en la progtwigción, pero si en caso de que solo está consultando para verificar algo se puede utilizar.