将不在中的SQL更改为联接

将不在中的SQL更改为联接,sql,join,sql-server-2012,notin,Sql,Join,Sql Server 2012,Notin,大家好 我们的目标是获得一个脚本,该脚本将在中间表(ProductTaxCategory)中插入缺失的product-TaxCategory对 以下脚本正常工作,但我们正在尝试找到优化它的方法: INSERT ProductTaxCategory (ProductTaxCategory_TaxCategoryId,ProductTaxCategory_ProductId) SELECT TaxCategoryId ,ProductId FROM Product pr

大家好

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

以下脚本正常工作,但我们正在尝试找到优化它的方法:

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
进行
左连接
,并检查
null

像这样的

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

使用
交叉连接
除了

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
交叉连接
将搜索所有可能的对<代码>除了将为您提供缺少的内容。最后,您可以
将它们插入表中。

尝试类似的操作(现在是完整语句):


存在于
(选择1…其中ID=…)
通常是(从…)中选择ID
构造中
的更好选择。

合并在您的情况下可能会更好OP有两个不同的列:
ProductTaxCategory\u TaxCategoryId,ProductTaxCategory\u ProductId
谢谢!这需要160毫秒来执行,而我的需要1210毫秒
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)