从重复记录中获取第一条记录并在其他表中使用其标识
Get first record from duplicate records and use its identity in other tables
我有两个临时文件 table,其中有重复项。两个 tables 包含如下记录。
DECLARE @TempCompany TABLE (TempCompanyCode VARCHAR(100), TempCompanyName VARCHAR(100))
INSERT INTO @TempCompany VALUES ('00516','Company1')
INSERT INTO @TempCompany VALUES ('00135','Company1')
INSERT INTO @TempCompany VALUES ('00324','Company2')
INSERT INTO @TempCompany VALUES ('00566','Company2')
SELECT * FROM @TempCompany
DECLARE @TempProduct TABLE (TempProductCode VARCHAR(100), TempProductName VARCHAR(100), TempCompanyCode VARCHAR(100))
INSERT INTO @TempProduct VALUES ('001000279','Product1','00516')
INSERT INTO @TempProduct VALUES ('001000279','Product1','00135')
INSERT INTO @TempProduct VALUES ('001000300','Product2','00135')
INSERT INTO @TempProduct VALUES ('001000278','Product3','00566')
INSERT INTO @TempProduct VALUES ('001000278','Product3','00324')
INSERT INTO @TempProduct VALUES ('001000304','Product4','00566')
SELECT * FROM @TempProduct
公司为主 table,产品为子 table。产品包含公司参考资料。现在这些是我的临时 tables,我需要将这些 tables 中的正确值插入到我的主要 table.
我想插入如下记录
DECLARE @Company TABLE(CompanyID INT IDENTITY(1,1), CompanyCode VARCHAR(100), CompanyName VARCHAR(100))
INSERT INTO @Company VALUES ('00516','Company1')
DECLARE @IDOf00516 INT = @@IDENTITY
INSERT INTO @Company VALUES ('00324','Company2')
DECLARE @IDOf00324 INT = @@IDENTITY
SELECT * FROM @Company
DECLARE @Product TABLE(ProductID INT IDENTITY(1,1), ProductCode VARCHAR(100), ProductName VARCHAR(100), CompanyID INT)
INSERT INTO @Product VALUES ('001000279','Product1',@IDOf00516)
INSERT INTO @Product VALUES ('001000300','Product2',@IDOf00516)
INSERT INTO @Product VALUES ('001000278','Product3',@IDOf00324)
INSERT INTO @Product VALUES ('001000300','Product4',@IDOf00324)
SELECT * FROM @Product
我附上了下图,以了解 运行 查询时的外观。
有人可以帮忙吗?
我可能会首先将唯一记录从 tempCompany 插入到公司 table,然后从 TempProduct 执行插入并查找插入的公司 tables。
即首先插入公司:
INSERT INTO @Company (CompanyCode, CompanyName)
SELECT temp.TempCompanyCode, temp.TempCompanyName
FROM @TempCompany AS temp
然后使用联接插入产品以查找公司 ID:
INSERT INTO @Product (ProductCode, ProductName, CompanyId)
SELECT temp.TempProductCode, temp.TempProductName, c.CompanyID
FROM @TempProduct AS temp
JOIN @Company AS c ON temp.TempCompanyCode = c.CompanyCode -- Lookup to find CompanyID
然而,这并没有考虑重复项以及主要 tables 已经插入记录的可能性。
添加重复项并检查已存在的记录,最终结果可能如下所示:
--1. insert records not already in company table:
INSERT INTO @Company (CompanyCode, CompanyName)
SELECT DISTINCT temp.TempCompanyCode, temp.TempCompanyName
FROM @TempCompany AS temp
LEFT JOIN @Company AS c ON temp.TempCompanyCode = c.CompanyCode -- Will match Companies that already exists in @Companies
WHERE c.CompanyID IS NULL -- Company does not already exist
ORDER BY temp.TempCompanyCode
--2. insert product records:
INSERT INTO @Product (ProductCode, ProductName, CompanyId)
SELECT DISTINCT temp.TempProductCode, temp.TempProductName, c.CompanyID
FROM @TempProduct AS temp
JOIN @Company AS c ON temp.TempCompanyCode = c.CompanyCode -- Lookup to find CompanyID
LEFT JOIN @Product AS p ON temp.TempProductCode = p.ProductCode AND temp.TempCompanyCode = c.CompanyCode -- Will match products that already exists in @Products
WHERE p.ProductID IS NULL -- Product does not already exists
ORDER BY c.CompanyID, temp.TempProductCode
--3. Check result
SELECT * FROM @Company
SELECT * FROM @Product
请注意,我使用 LEFT JOIN 并添加 WHERE 条件来检查记录是否已存在于您的主 tables 中。
使用 MERGE 语句可以很好地实现这一点 - 但我已经习惯了可读性稍差的 LEFT JOIN/WHERE 方法:)
编辑
只有 TempCompanyName 用于确定 TempCompany 中的行是否唯一。 IE。公司代码为 00135 的公司 1 应该不被插入。
为此,我会利用 ROW_NUMBER 帮助查找要插入的公司行。我在@TempCompany 中添加了一个标识列,以确保插入的第一行将是使用的行(即确保 00516 用于 Company1 而不是 00135)。
新@TempCompany 定义:
DECLARE @TempCompany TABLE (TempCompanyId INT IDENTITY(1,1), TempCompanyCode VARCHAR(100), TempCompanyName VARCHAR(100))
并更新了脚本,添加了 row_number 和从 Product 通过 TempCompany(按名称)到 Company 的额外连接。额外的连接是为了使 CompanyCode 为 00516 和 CompanyCode 为 00135 的 Product1 都能被正确处理:
--1. insert records not already in company table:
;WITH OrderedTempCompanyRows AS (SELECT ROW_NUMBER() OVER (PARTITION BY TempCompanyName ORDER BY TempCompanyId) AS RowNo, TempCompanyCode, TempCompanyName FROM @TempCompany)
INSERT INTO @Company (CompanyCode, CompanyName)
SELECT DISTINCT temp.TempCompanyCode, temp.TempCompanyName
FROM OrderedTempCompanyRows temp
LEFT JOIN @Company AS c ON temp.TempCompanyName = c.CompanyName -- Will match Companies that already exists in @Companies
WHERE temp.RowNo = 1 -- Only first company according to row_number
AND c.CompanyID IS NULL -- Company does not already exist
ORDER BY temp.TempCompanyName
--2. insert product records:
INSERT INTO @Product (ProductCode, ProductName, CompanyId)
SELECT DISTINCT temp.TempProductCode, temp.TempProductName, c.CompanyID
FROM @TempProduct AS temp
JOIN @TempCompany tc ON temp.TempCompanyCode = tc.TempCompanyCode -- Find Companyname in @Tempcompany table
JOIN @Company AS c ON tc.TempCompanyName = c.CompanyName -- Join to @Company on Companyname to find CompanyID
LEFT JOIN @Product AS p ON temp.TempProductCode = p.ProductCode AND temp.TempCompanyCode = c.CompanyCode -- Will match products that already exists in @Products
WHERE p.ProductID IS NULL -- Product does not already exists
ORDER BY c.CompanyID, temp.TempProductName
--3. Check result
SELECT * FROM @Company
SELECT * FROM @Product
我有两个临时文件 table,其中有重复项。两个 tables 包含如下记录。
DECLARE @TempCompany TABLE (TempCompanyCode VARCHAR(100), TempCompanyName VARCHAR(100))
INSERT INTO @TempCompany VALUES ('00516','Company1')
INSERT INTO @TempCompany VALUES ('00135','Company1')
INSERT INTO @TempCompany VALUES ('00324','Company2')
INSERT INTO @TempCompany VALUES ('00566','Company2')
SELECT * FROM @TempCompany
DECLARE @TempProduct TABLE (TempProductCode VARCHAR(100), TempProductName VARCHAR(100), TempCompanyCode VARCHAR(100))
INSERT INTO @TempProduct VALUES ('001000279','Product1','00516')
INSERT INTO @TempProduct VALUES ('001000279','Product1','00135')
INSERT INTO @TempProduct VALUES ('001000300','Product2','00135')
INSERT INTO @TempProduct VALUES ('001000278','Product3','00566')
INSERT INTO @TempProduct VALUES ('001000278','Product3','00324')
INSERT INTO @TempProduct VALUES ('001000304','Product4','00566')
SELECT * FROM @TempProduct
公司为主 table,产品为子 table。产品包含公司参考资料。现在这些是我的临时 tables,我需要将这些 tables 中的正确值插入到我的主要 table.
我想插入如下记录
DECLARE @Company TABLE(CompanyID INT IDENTITY(1,1), CompanyCode VARCHAR(100), CompanyName VARCHAR(100))
INSERT INTO @Company VALUES ('00516','Company1')
DECLARE @IDOf00516 INT = @@IDENTITY
INSERT INTO @Company VALUES ('00324','Company2')
DECLARE @IDOf00324 INT = @@IDENTITY
SELECT * FROM @Company
DECLARE @Product TABLE(ProductID INT IDENTITY(1,1), ProductCode VARCHAR(100), ProductName VARCHAR(100), CompanyID INT)
INSERT INTO @Product VALUES ('001000279','Product1',@IDOf00516)
INSERT INTO @Product VALUES ('001000300','Product2',@IDOf00516)
INSERT INTO @Product VALUES ('001000278','Product3',@IDOf00324)
INSERT INTO @Product VALUES ('001000300','Product4',@IDOf00324)
SELECT * FROM @Product
我附上了下图,以了解 运行 查询时的外观。
有人可以帮忙吗?
我可能会首先将唯一记录从 tempCompany 插入到公司 table,然后从 TempProduct 执行插入并查找插入的公司 tables。
即首先插入公司:
INSERT INTO @Company (CompanyCode, CompanyName)
SELECT temp.TempCompanyCode, temp.TempCompanyName
FROM @TempCompany AS temp
然后使用联接插入产品以查找公司 ID:
INSERT INTO @Product (ProductCode, ProductName, CompanyId)
SELECT temp.TempProductCode, temp.TempProductName, c.CompanyID
FROM @TempProduct AS temp
JOIN @Company AS c ON temp.TempCompanyCode = c.CompanyCode -- Lookup to find CompanyID
然而,这并没有考虑重复项以及主要 tables 已经插入记录的可能性。 添加重复项并检查已存在的记录,最终结果可能如下所示:
--1. insert records not already in company table:
INSERT INTO @Company (CompanyCode, CompanyName)
SELECT DISTINCT temp.TempCompanyCode, temp.TempCompanyName
FROM @TempCompany AS temp
LEFT JOIN @Company AS c ON temp.TempCompanyCode = c.CompanyCode -- Will match Companies that already exists in @Companies
WHERE c.CompanyID IS NULL -- Company does not already exist
ORDER BY temp.TempCompanyCode
--2. insert product records:
INSERT INTO @Product (ProductCode, ProductName, CompanyId)
SELECT DISTINCT temp.TempProductCode, temp.TempProductName, c.CompanyID
FROM @TempProduct AS temp
JOIN @Company AS c ON temp.TempCompanyCode = c.CompanyCode -- Lookup to find CompanyID
LEFT JOIN @Product AS p ON temp.TempProductCode = p.ProductCode AND temp.TempCompanyCode = c.CompanyCode -- Will match products that already exists in @Products
WHERE p.ProductID IS NULL -- Product does not already exists
ORDER BY c.CompanyID, temp.TempProductCode
--3. Check result
SELECT * FROM @Company
SELECT * FROM @Product
请注意,我使用 LEFT JOIN 并添加 WHERE 条件来检查记录是否已存在于您的主 tables 中。 使用 MERGE 语句可以很好地实现这一点 - 但我已经习惯了可读性稍差的 LEFT JOIN/WHERE 方法:)
编辑
只有 TempCompanyName 用于确定 TempCompany 中的行是否唯一。 IE。公司代码为 00135 的公司 1 应该不被插入。
为此,我会利用 ROW_NUMBER 帮助查找要插入的公司行。我在@TempCompany 中添加了一个标识列,以确保插入的第一行将是使用的行(即确保 00516 用于 Company1 而不是 00135)。
新@TempCompany 定义:
DECLARE @TempCompany TABLE (TempCompanyId INT IDENTITY(1,1), TempCompanyCode VARCHAR(100), TempCompanyName VARCHAR(100))
并更新了脚本,添加了 row_number 和从 Product 通过 TempCompany(按名称)到 Company 的额外连接。额外的连接是为了使 CompanyCode 为 00516 和 CompanyCode 为 00135 的 Product1 都能被正确处理:
--1. insert records not already in company table:
;WITH OrderedTempCompanyRows AS (SELECT ROW_NUMBER() OVER (PARTITION BY TempCompanyName ORDER BY TempCompanyId) AS RowNo, TempCompanyCode, TempCompanyName FROM @TempCompany)
INSERT INTO @Company (CompanyCode, CompanyName)
SELECT DISTINCT temp.TempCompanyCode, temp.TempCompanyName
FROM OrderedTempCompanyRows temp
LEFT JOIN @Company AS c ON temp.TempCompanyName = c.CompanyName -- Will match Companies that already exists in @Companies
WHERE temp.RowNo = 1 -- Only first company according to row_number
AND c.CompanyID IS NULL -- Company does not already exist
ORDER BY temp.TempCompanyName
--2. insert product records:
INSERT INTO @Product (ProductCode, ProductName, CompanyId)
SELECT DISTINCT temp.TempProductCode, temp.TempProductName, c.CompanyID
FROM @TempProduct AS temp
JOIN @TempCompany tc ON temp.TempCompanyCode = tc.TempCompanyCode -- Find Companyname in @Tempcompany table
JOIN @Company AS c ON tc.TempCompanyName = c.CompanyName -- Join to @Company on Companyname to find CompanyID
LEFT JOIN @Product AS p ON temp.TempProductCode = p.ProductCode AND temp.TempCompanyCode = c.CompanyCode -- Will match products that already exists in @Products
WHERE p.ProductID IS NULL -- Product does not already exists
ORDER BY c.CompanyID, temp.TempProductName
--3. Check result
SELECT * FROM @Company
SELECT * FROM @Product