如何在所有提到的条件下写下面的SQL查询?

时间:2012-02-29 09:29:49

标签: sql oracle

我正在使用java / oracle。我有以下问题。

SELECT
         DISTINCT id_one,
         status 
     FROM
         sometable 
     WHERE
         id_two IN (
             SELECT
                 DISTINCT id_two  
             FROM
                 othertable
         ) 
         AND id_one IN (1946,1948,1949)  

我有以上查询从一个表中获取数据。来自其他表的内部查询数据。 现在我需要在内部查询中添加一个条件。 othertable还有一个名为name的字段。

这些是我提到的ID:1946,1948,1949。这里每个id的名称如下:name1,name2,name3 name1,name2,name3从java应用程序传递。

最后我需要的查询如下。

SELECT
         DISTINCT id_one,
         status 
     FROM
         sometable 
     WHERE
         id_two IN (
             SELECT
                 DISTINCT id_two  
             FROM
                 othertable other where other.name in('name1','name2','name3')
         ) 
         AND id_one IN (1946,1948,1949)  

我的问题是: 1946年id name1应该被考虑,1948年id name2应被视为 * 和1949年id name3应被视为标准。 *我的意思是查询不应该考虑每个id的所有3个名称。

我怎样才能实现它?

2 个答案:

答案 0 :(得分:0)

来自doc:http://docs.oracle.com/cd/B19306_01/server.102/b14200/conditions013.htm

SELECT DISTINCT id_one, status 
FROM sometable 
WHERE 
 id_two IN ( 
   SELECT DISTINCT id_two
   FROM othertable other 
   where ( other.name, id_one )  in (
       select 'name1',1946 from dual union all
       select 'name2',1948 from dual union all
       select 'name3',1949 from dual )
  )

答案 1 :(得分:0)

这也可以通过以下方式完成:

select distinct s.id_one, s.status
  from sometable s join othertable o on (s.id_two = o.id_two)
 where (s.id_one = 1946 and o.name = 'name1')
    OR (s.id_one = 1948 and o.name = 'name2')
    OR (s.id_one = 1949 and o.name = 'name3');