条件纯sql查询

时间:2015-12-18 23:45:34

标签: sql oracle oracle11g

这是我面临的问题的一个简单例子。我有两个表,Job和Person。一个人可以在一个或多个工作岗位上工作。我需要使用特定人员的工作ID返回一列数据,但如果该人员在job_id ='god'工作,那么它应该返回所有工作ID。我正在使用一个框架,这必须在SQL语句而不是PLSQL中完成(这就是为什么我在努力解决这个问题)。

**JOB**

JOB_ID | JOB_NAME
doc       Doctor
ba        Barber
god       Admin

**PERSON**

PERSON_ID | JOB_ID
 Jeff       doc
 Jeff       ba
 Mary       ba
 Thor       god

到目前为止,我能够返回用户所属的所有工作,但如果在某个人有一个job_id ='上帝',我需要以某种方式返回所有工作。

select DISTINCT p.JOB_ID
  from PER_JOBS p,PER_PEOPLE pu
WHERE
p.JOB_ID= pu.JOB_ID
and pu.PERSON_ID = 'thor';

所以,如果我选择了Jeff:doc和ba应该被退回,而如果我选择Thor:doc,ba和god应该被退回。

3 个答案:

答案 0 :(得分:3)

您需要在此处进行连接,然后添加where子句以获得所需内容。联接看起来像这样

SELECT P.PERSON_ID, J.JOB_NAME
FROM PERSON P
JOIN JOB J ON (P.JOB_ID = J.JOB_ID) OR P.JOB_ID = 'god'

这将为您提供人员及其工作的列表。你甚至可以把它作为一个观点。

现在只需选择您想要的人

SELECT P.PERSON_ID, J.JOB_NAME
FROM PERSON P
JOIN JOB J ON (P.JOB_ID = J.JOB_ID) OR P.JOB_ID = 'god'
WHERE P.PERSON_ID = 'thor';

答案 1 :(得分:1)

以下是查询:

select distinct j.job_id from job j join person p
on ((j.job_id = p.job_id and p.job_id <> 'god') or p.job_id = 'god')
where p.person_id = 'Thor';

JOB_ID
----------
doc
ba
god

select distinct j.job_id from job j join person p
on ((j.job_id = p.job_id and p.job_id <> 'god') or p.job_id = 'god')
where p.person_id = 'Jeff';

JOB_ID
----------
doc
ba

答案 2 :(得分:0)

我认为解决这个问题的最快方法是使用两个exists子句:

select j.*
from job j
where exists (select 1 from person p where p.job_id = j.job_id) or
      exists (select 1 from person p where p.job_id = 'god');

这可以利用person(job_id)上的索引。而且,由于不需要删除重复项,因此它的返回速度应该比select distinct解决方案快得多。