SQL WHERE IN子句中有多个列

我需要在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 ) 

但WHERE..IN子句只允许1列。 我怎么能比较2个或更多的列与另一个内部的SELECT?

您可以从子查询中生成派生表,并将table1连接到此派生表:

 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 

您将需要使用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) 

一个简单的EXISTS子句是最干净的

 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 ) 

如果你在关联中有多行,那么一个JOIN会在输出中给出多行,所以你需要不同的行。 这通常使EXISTS更有效率。

注意带有JOIN的“SELECT”*还将包括行限制表中的列

为什么使用WHERE EXISTS或DERIVED TABLES,当你可以做一个正常的内部连接:

 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 

如果(CM_PLAN_ID,Individual_ID)对在状态表中不是唯一的,则可能需要SELECT DISTINCT t。*。

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

注意:
Oracle会忽略其中一个或多个选定列为NULL的行。 在这些情况下,您可能想要使用NVL- Funktion将NULL映射到特殊值(不应该在值中);

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

如果你想要一个表,然后使用下面的查询

 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') 

和表格数据如下

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

然后输出如下

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

我们可以简单地这样做。

  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 

我以这种方式build立起来

 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 ) 

希望这个帮助:)

简单和错误的方式将结合使用+或连接两列,并作出一列。

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

这将是非常缓慢的offcourse。 不能在编程中使用,但如果你只是查询validation可能会使用的东西。