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可能会使用的东西。