将 SQL NOT IN 更改为 JOINS

Changing SQL NOT IN to JOINS

大家好,

我们的目标是获得一个脚本,该脚本将在中间插入缺失的产品对 - TaxCategory table (ProductTaxCategory)

以下脚本可以正常工作,但我们正在努力寻找优化它的方法:

INSERT ProductTaxCategory
    (ProductTaxCategory_TaxCategoryId,ProductTaxCategory_ProductId)
SELECT 
    TaxCategoryId
    ,ProductId 
FROM Product pr
CROSS JOIN TaxCategory tx
WHERE pr.ProductId NOT IN 
(
    SELECT ProductTaxCategory_ProductId
    FROM ProductTaxCategory
) 
OR
pr.ProductId IN 
(
    SELECT ProductTaxCategory_ProductId 
    FROM ProductTaxCategory
) 
AND
tx.TaxCategoryId NOT IN 
(
    SELECT ProductTaxCategory_TaxCategoryId 
    FROM ProductTaxCategory 
    WHERE ProductTaxCategory_ProductId = pr.ProductId
 )

我们如何优化这个查询?

您可以使用 ProductTaxCategory 执行 LEFT JOIN 并检查 NULLs

像这样。

INSERT ProductTaxCategory
(
    ProductTaxCategory_TaxCategoryId,
    ProductTaxCategory_ProductId
)
SELECT p.TaxCategoryId, p.ProductId 
FROM 
(
    SELECT TaxCategoryId, ProductId
    FROM Product pr
    CROSS JOIN TaxCategory tx
) p
LEFT JOIN ProductTaxCategory ptx
    ON P.TaxCategoryId = ptx.ProductTaxCategory_TaxCategoryId 
    AND P.ProductId = ptx.ProductTaxCategory_ProductId
WHERE ptx.ProductTaxCategory_ProductId IS NULL

使用CROSS JOINEXCEPT

INSERT ProductTaxCategory(ProductTaxCategory_ProductId, ProductTaxCategory_TaxCategoryId)

SELECT p.ProductID, tc.TaxCategoryId FROM Product p CROSS JOIN TaxCategory tc

EXCEPT

SELECT ProductTaxCategory_ProductId, ProductTaxCategory_TaxCategoryId  FROM ProductTaxCategory

CROSS JOIN 将搜索所有可能的对。 EXCEPT 将为您找到所缺少的东西。最后你可以 INSERT 他们到 table.

尝试类似的东西(现在完整的陈述):

INSERT INTO ProductTaxCategory
    (ProductTaxCategory_TaxCategoryId,ProductTaxCategory_ProductId)
SELECT TaxCategoryId, ProductId 
FROM Product pr CROSS JOIN TaxCategory tx
WHERE NOT EXISTS
       (SELECT 1 FROM ProductTaxCategory 
        WHERE ProductTaxCategory_ProductId     = pr.ProductId
        AND   ProductTaxCategory_TaxCategoryId = tx.TaxCategoryId)

EXISTS(SELECT 1 ... WHERE ID=...) 通常是 IN (SELECT ID FROM ... ) 构造的更好替代方案。