2017-05-09 1 views
2

私は2つの列に基づいて2つの列に基づいてデータを取得するSQLのテーブルを2つの値のリストに渡します。例えば : - それは、私はちょうどSqlは2つの列を2つの列に渡してデータを取得します

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

のように両方の 列の値の正確な一致に基づいてデータを取得したいテーブル名「従業員」

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

とテーブルを考えることができます最初の行を返します。クエリはこの

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

ようになる場合には、すべての3つの行の代わりに、第一及び第三の行を返します。 「SQL」エンジンは、与えられた値の組み合わせをすべて で実行していることがわかります。しかし、私は上記の値のためにデータ を処理するためにクエリを必要とするので、最初と3番目の行を返します。 ソリューションはありますか? ありがとうございます。あなたが探しているように見える何

+0

使用しているdbmsにタグを付けます。 (すべてのdbms製品でサポートされていないANSI SQL準拠の回答が1つあります) – jarlh

答えて

2

あなたのDBMSが行型などサポートしている場合:

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

ISO/ANSI SQL準拠:使用されているコアSQL-2003外

次の特徴:

F641を、「行テーブルコンストラクタ」

T051「行タイプ」

あなたは別のテーブルに探している値を入れて、この(Oracleの例)のようなクエリを記述する必要が

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) 

あなたの2番目のクエリは、実際に3つのすべての行を返します - それは、基本的にproject_idが7または5 のいずれかである任意の行を要求しますresource_idは46または87のいずれかです.3つの行はすべてこの基準に一致します。あなたは間違っている

は互いに相関に2つの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) 
関連する問題