将不在中的SQL更改为联接
大家好 我们的目标是获得一个脚本,该脚本将在中间表(ProductTaxCategory)中插入缺失的product-TaxCategory对 以下脚本正常工作,但我们正在尝试找到优化它的方法:将不在中的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
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)