我目前有一个名为_01769_jobs
的表:
从此表中,我想选择user_id
不等于163084
且状态等于QC_COMPLETE
的所有行:
SELECT * FROM _01769_jobs WHERE user_id != 163084 AND status = 'QC_COMPLETE';
从这里开始,我想进一步优化这些结果,以排除job_id
功能结果中列出job_id
为blind_qc_get_worked_on_jobs_by_project_by_user
的所有条目。
调用该函数会产生以下结果:
SELECT * FROM blind_qc_get_worked_on_jobs_by_project_by_user(1769, 163084);
我现在想要修改我的初始查询,以排除从函数调用返回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' ;
和一些变化,但我不太确定如何获得所需的结果。
答案 0 :(得分:2)
您可以使用not in
或not 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
);
答案 1 :(得分: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_id
和product_id
值,则不同的数据库引擎会为此使用不同的功能。 Postgres可以通过横向连接 - http://blog.heapanalytics.com/postgresqls-powerful-new-join-type-lateral/
如果您的数据库引擎没有横向连接或交叉应用,则需要将该功能的代码重新加工并按摩到您的特定select
。