根据条件排除行

时间:2016-05-31 19:24:45

标签: sql postgresql

我目前有一个名为_01769_jobs的表:

_01769_jobs

从此表中,我想选择user_id不等于163084且状态等于QC_COMPLETE的所有行:

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

Result of Query

从这里开始,我想进一步优化这些结果,以排除job_id功能结果中列出job_idblind_qc_get_worked_on_jobs_by_project_by_user的所有条目。

调用该函数会产生以下结果:

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' ;

和一些变化,但我不太确定如何获得所需的结果。

2 个答案:

答案 0 :(得分: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
                 );

答案 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_idproduct_id值,则不同的数据库引擎会为此使用不同的功能。 Postgres可以通过横向连接 - http://blog.heapanalytics.com/postgresqls-powerful-new-join-type-lateral/

来实现

如果您的数据库引擎没有横向连接或交叉应用,则需要将该功能的代码重新加工并按摩到您的特定select