这是我面临的问题的一个简单例子。我有两个表,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应该被退回。
答案 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
解决方案快得多。