2016-05-31 86 views
0

排除排我现在有一个表叫_01769_jobs根据病情

_01769_jobs

从这个表,我要选择所有的行,其中user_id不等于163084和地位平等到QC_COMPLETE

SELECT * FROM _01769_jobs WHERE user_id != 163084 AND status = 'QC_COMPLETE'; 

Result of Query

FRO在这里,我想进一步优化这些结果,以排除blind_qc_get_worked_on_jobs_by_project_by_user函数的结果中列出的job_idjob_id的任何条目。

调用函数结果如下:

SELECT * FROM blind_qc_get_worked_on_jobs_by_project_by_user(1769, 163084); 

result from function call

我现在想修改我的初步查询,以排除其job_id的函数调用中返回的行。

我已经试过:

SELECT * FROM _01769_jobs jobs left join blind_qc_get_worked_on_jobs_by_project_by_user(1769, 163084) bqc_jobs on jobs.job_id = bqc_jobs.job_id WHERE jobs.user_id != 163084 AND bqc_jobs.user_id != 163084 AND jobs.status = 'QC_COMPLETE' ; 

和一些变化,但我不太清楚如何得到想要的结果。

回答

1

在大多数形式的SQL,你可以使用一个NOT IN子句此。

SELECT * FROM _01769_jobs 
WHERE user_id != 163084 
    AND status = 'QC_COMPLETE' 
    AND job_id NOT IN (
     SELECT job_id 
     FROM blind_qc_get_worked_on_jobs_by_project_by_user(1769, 163084) 
) 

Postgres的似乎也不例外 - http://www.postgresqltutorial.com/postgresql-in/

如果你需要这个变化user_idproduct_id的价值观,不同的数据库引擎使用不同的功能这一点。 Postgres的可能是能够与做横向加入 - http://blog.heapanalytics.com/postgresqls-powerful-new-join-type-lateral/

如果你的数据库引擎不具有横向联接或交叉应用,则需要返工和函数的代码按摩到您的特定select

+0

我很欣赏这个答案的简单性。将标记解决(在7分钟内) –

2

你可以使用not innot exists

SELECT j.* 
FROM _01769_jobs j 
WHERE j.user_id <> 163084 AND j.status = 'QC_COMPLETE' AND 
     NOT EXISTS (SELECT 1 
        FROM blind_qc_get_worked_on_jobs_by_project_by_user(1769, 163084) jpu 
        WHERE jpu.jobid = j.job_id 
       );