SQL 使用第三个 table 进一步过滤结果的查询

SQL query that uses a third table to filter results further

我正在使用 MSSQL 编写查询,我试图在两个 table 之间过滤数据,然后使用来自第三个 table 的数据进一步优化它。

共有三个table。一个是主要 table (tbl1),次要 table 列出有缺陷的产品 (tbl2)。它们根据一列内的状态插入到此 table 中。第三个 table 保存装运数据 (tbl3)。在某些情况下,有缺陷的产品已包含在发货中。

此查询提供了所有有缺陷的项目的列表:

SELECT tbl1.ProductSerialNumber, tbl1.ProductSize, tbl1.ProductColor, tbl2.NCRNumber, tbl1.ReasonFailure, tbl1.ProductStatus, tbl2.Notes, tbl1.Date_Time
FROM     tbl1 INNER JOIN
                  tbl2 ON tbl1.ProductSerialNumber = tbl2.ProductSerialNumber
WHERE  (tbl1.ProductStatus LIKE '%NCR' OR
                  tbl1.ProductStatus IS NULL) AND (tbl2.NCRNumber IS NOT NULL)
ORDER BY tbl1.Date_Time DESC

我面临的问题是使用第三个 table 来进一步过滤结果。第三个 table 中的 WorkOrder 包含所有发货的编号。如果装运的 WorkOrder 为 0(零),我不想在结果中显示它,应该显示所有其他 WorkOrder 编号。目标是过滤掉缺失缺陷并已分配给 WorkOrder 0(零)的产品。

我试过的查询

SELECT tbl1.ProductSerialNumber, tbl1.ProductSize, tbl1.ProductColor, tbl2.NCRNumber, tbl1.ReasonFailure, tbl1.ProductStatus, tbl2.Notes, tbl1.Date_Time, 
                  tbl3.WorkOrder
FROM     tbl1 INNER JOIN
                  tbl2 ON tbl1.ProductSerialNumber = tbl2.ProductSerialNumber INNER JOIN
                  tbl3 ON tbl1.ProductSerialNumber = tbl3.ProductSerialNumber
WHERE  (tbl1.ProductStatus LIKE '%NCR' OR
                  tbl1.ProductStatus IS NULL) AND (tbl2.NCRNumber IS NOT NULL) AND (tbl3.WorkOrder <> N'0')
ORDER BY tbl1.Date_Time DESC

我会用 NOT IN 来做:

SELECT tbl1.ProductSerialNumber, tbl1.ProductSize, tbl1.ProductColor, tbl2.NCRNumber, tbl1.ReasonFailure, tbl1.ProductStatus, tbl2.Notes, tbl1.Date_Time, 
                  tbl3.WorkOrder
FROM     tbl1 INNER JOIN
                  tbl2 ON tbl1.ProductSerialNumber = tbl2.ProductSerialNumber 
WHERE  (tbl1.ProductStatus LIKE '%NCR' OR
                  tbl1.ProductStatus IS NULL) AND (tbl2.NCRNumber IS NOT NULL) AND
                  tbl1.ProductSerialNumber NOT IN (
                      SELECT tbl3.ProductSerialNumber
                      FROM tbl3
                      WHERE (tbl3.WorkOrder = N'0')
                  )
ORDER BY tbl1.Date_Time DESC

此查询在更短的执行时间内为您提供输出:-

SELECT tbl1.ProductSerialNumber, tbl1.ProductSize, tbl1.ProductColor, tbl2.NCRNumber, 
tbl1.ReasonFailure, tbl1.ProductStatus, tbl2.Notes, tbl1.Date_Time,tbl3.WorkOrder
FROM tbl1 INNER JOIN
     tbl2 ON tbl1.ProductSerialNumber = tbl2.ProductSerialNumber 
WHERE  (tbl1.ProductStatus LIKE '%NCR' OR  tbl1.ProductStatus IS NULL) 
AND (tbl2.NCRNumber IS NOT NULL) 
AND NOT EXISTS(SELECT 1 FROM tbl3 WHERE tbl1.ProductSerialNumber = tbl3.ProductSerialNumber AND tbl3.WorkOrder=N'0')
ORDER BY tbl1.Date_Time DESC