通过将两个列表传递到两列来检索数据的Sql查询

3

我在SQL中有一个表格,我想通过传递两个值列表来基于两列检索数据。 例如:假设有一个名称为“employee”的表格。

-----------------------------
| 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”引擎在执行查询时考虑了所有给定值的组合。但是,我需要查询处理上述值的数据,以便只返回第一行和第三行。是否有任何解决方案?谢谢。


标记您正在使用的数据库管理系统(dbms)。 (您有一个符合ANSI SQL标准的答案,但可能不受所有dbms产品支持。) - jarlh
3个回答

5
如果您的数据库管理系统支持行类型等:
select *
from employee 
where (project_id, resource_id) in ((7, 46), (5, 87))

ISO/ANSI SQL合规性:

使用了以下Core SQL-2003之外的功能:

F641,“行和表构造器”

T051,“行类型”

F561,“完整值表达式”

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

您提供的信息非常有价值。但是在上述情况中传递参数的值是静态的。(7, 46), (5, 87)。但我需要在那个位置使用子查询。 - ram vinoth
1
我喜欢这个解决方案,因为我可以在VBA中从一个外部固定表格构建WHERE子句。谢谢,jarlh - Hans Schulze

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 子句相互关联


那个 ** 是什么? - jarlh
我明白了...谢谢! - jarlh
感谢您宝贵的回复。但是我要传递的值不是单个数据,而是一组数值。 - ram vinoth
当然可以,但是根据您的输入,@ramvinoth,您的数据库可能无法直接处理它们以满足您的要求。 - DigiFriend

0
你需要将你所寻找的值放入一个单独的表中,并编写类似以下的查询语句(以Oracle为例):
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) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接