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
我正在使用 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