2017-05-09 27 views
2

我在sql中有一个表,其中,我想通过 传递两个值列表来检索基于两列的数据。 例如: - 让我们考虑一个表,表名“员工”Sql通过将两个列表传递给两列来检索数据

----------------------------- 
| project_id | resource_id | 
----------------------------- 
|  7  |  46  | 
----------------------------- 
|  7  |  87  | 
----------------------------- 
|  5  |  87  | 
------------------------------ 

我想找回基于在两个 列值的精确匹配的数据就像

"select * from employee where project_id = 7 and resource_id = 46;" 

则返回第一行。如果查询会是这样的

"select * from employee where project_id in (7,5) and resource_id in 
(46,87);" 

它将返回所有三行而不是第一和第三行。 我可以理解,'sql'引擎通过给出的值的所有 组合执行查询。但是,我需要查询来处理上述值的数据 ,以返回第一行和第三行。有没有 解决方案? 在此先感谢。

+0

标记您正在使用的dbms。 (您有一个ANSI SQL兼容的答案,可能不被所有dbms产品支持。) – jarlh

回答

2

如果你的DBMS支持行类型等:

select * 
from employee 
where (project_id, resource_id) in ((7, 46), (5, 87)) 

ISO/ANSI SQL标准:

核心SQL-2003外的以下功能的使用:

F641,“行和表格构造函数“

T051,”行类型“

F561“全值表达式”

(据http://developer.mimer.se/validator/parser200x/

+0

非常感谢。其工作.. –

+0

您提供的信息很有价值。但是在上面的例子中参数中传递的值是静态的。 (7,46),(5,87)。但我需要在那个地方使用子查询。 –

0

你似乎在寻找什么是:

select * from employee 
where (project_id = 7 and resource_id = 46) 
    or (project_id = 5 and resource_id = 87) 

你的第二个查询确实将返回所有三排 - 它本质要求对于其中project_id是任何行7或5 resource_id可以是46或87--所有三行都符合此条件。

你出错的地方在于期待两个IN从句与相互关联彼此。

+0

那是什么'**'? – jarlh

+0

我明白了......谢谢! – jarlh

+0

感谢您的宝贵回复。但是我要传递的价值不是一个单一的数据。它将是一个值的列表。 –

0

你需要把你正在寻找的值在一个单独的表,写这样的(甲骨文例子)查询:

with dataTable as (
select 7 project_id, 46 resource_id from dual 
union 
select 7, 87 from dual 
union 
select 5, 87 from dual) 
, 
listOfValues as (
select 7, 46 from dual 
union 
select 5, 87 from dual 
) 
select * from dataTable where (project_id, resource_id) in (select * from listOfValues)