SQL join with Where 子句仍然显示部分记录

SQL join with Where clause still displays part of record

我读过这个问题,因为它看起来很相似,但它对我的情况不太适用,而且我无法使这个解决方案适应我的问题: Left Join With Where Clause

我的 SQL 查询当前包含对 production_idJOBS table 的连接,如下所示:

SELECT md.production_id,manufacture_id, pr.product_code,j.production_id as jobs,j.job_type
FROM MANUFACTURE_DATE md
INNER JOIN PRODUCTS pr
on md.production_id = pr.production_id
LEFT JOIN JOBS j
on md.production_id = j.production_id
WHERE active='1' AND date='2021-09-09'
ORDER BY product_code DESC;

这个returns一个product_codejobstable中有一个记录job_type为3

关于与 JOBS table 的连接,我现在只想包含带有 job_type=1 而不是 job_type=2 or job_type=3 的值,所以我在加入如下:

SELECT md.production_id,manufacture_id, pr.product_code,j.production_id as jobs,j.job_type
FROM MANUFACTURE_DATE md
INNER JOIN PRODUCTS pr
on md.production_id = pr.production_id
LEFT JOIN JOBS j
on md.production_id = j.production_id AND j.job_type=1
WHERE active='1' AND date='2021-09-09'
ORDER BY product_code DESC;

这个returnsproduct_code在jobstable中有一条记录,对jobs.production_id and jobs.job_type

显示NULL

我的目标是完全不显示此 product_code,因为它出现在 JOBS table 中,但不符合所需的 job_type 1.

您的问题可以通过两种方式解决:

  1. 使用内部连接而不是左连接(假设制造 Table 中存在的所有 production_ids 也存在于作业 Table 中)

     SELECT md.production_id,manufacture_id,
     pr.product_code,jobs.production_id as jobs,jobs.job_type
     FROM MANUFACTURE_DATE md 
     INNER JOIN PRODUCTS pr 
     ON md.production_id = pr.production_id 
     INNER JOIN JOBS jobs 
     ON md.production_id = obs.production_id AND jobs.job_type=1 
     WHERE active='1' AND date='2021-09-09' ORDER BY product_code DESC;
    
  2. 在 job_type 上使用相同的过滤条件,但在 where 子句中还有一个条件:

     SELECT md.production_id,manufacture_id,
     pr.product_code,jobs.production_id as jobs,jobs.job_type
     FROM MANUFACTURE_DATE md
     INNER JOIN PRODUCTS pr
     on md.production_id = pr.production_id
     LEFT JOIN JOBS jobs
     on md.production_id = jobs.production_id 
     WHERE active='1' AND date='2021-09-09' 
     AND (jobs.job_type=1 OR jobs.production_id IS NULL)
     ORDER BY product_code DESC;
    

为什么你会出错可以通过下面给出的示例代码示例来解释link: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=876eb66e340e27b05ae543238b5a88ff