将来自两个相似 table 的数据插入 Sql 服务器中的一个主 table
Inserting data from two similar tables into one master table in Sql Server
Table1
-> Id, CountryFk, CompanyName
Table2
-> Id, CountryFk, CompanyName, Website
我需要将 Table1
和 Table2
合并为 1 个主 table。我知道这可以通过类似下面的查询来完成 -
INSERT INTO masterTable(Id, CountryFk, CompanyName)
SELECT * FROM Table1
UNION
SELECT * FROM Table2;
但是,我在 table2
中有一个额外的列 website
,而 table1
中没有。 masterTable
我需要这个专栏。
更重要的是,Table1
和 Table2
有重复的公司 countryFK
。例如,countryFK=123
处的 IBM
可能在 Table1
中出现两次。 Table1
可能有一个 companyName
出现在 Table2
中。
例如:countryFk = 123
的 IBM
可能出现在 table1
和 table2
中。我需要确保 masterTable
没有任何重复的公司。
请注意,公司名称本身不必是唯一的。 masterTable
可以 IBM
与 countryFK = 123
和 IBM
与 countryFk = 321
。
masterTable
不能 IBM
和 countryFk=123
两次。
试试这个 UNION
。
INSERT INTO masterTable(Id, CountryFk, CompanyName,Website)
SELECT Id, CountryFk, CompanyName, "Website" as Website FROM Table1
UNION
SELECT Id, CountryFk, CompanyName, Website FROM Table2 WHERE CompanyName NOT IN(SELECT CompanyName FROM Table1);
或
一次,您已将两个 table 数据合并到主 table 中,然后您可以查找重复数据并将其删除
;WITH cte
AS (SELECT ROW_NUMBER() OVER (PARTITION BY CountryFk, CompanyName
ORDER BY ( SELECT 0)) RN
FROM MyTable)
DELETE FROM cte
WHERE RN > 1
这可能有效
INSERT INTO masterTable(Id, CountryFk, CompanyName,Website)
SELECT Id, CountryFk, CompanyName, NULL as Website FROM Table1
UNION
SELECT Id, CountryFk, CompanyName,Website FROM Table2;
恕我直言,如果您需要确保 CompanyName
和 CountryFk
在 MasterTable 中不重复,您应该在该列上添加唯一索引。
下面的查询选择 Table1 和 Table2 中的所有不同值,并插入并检查 CompanyName
和 CountryFk
。
-- Id is identity, no need to insert value
INSERT MasterTable (CountryFk, CompanyName, WebSite)
SELECT
CountryFk,
CompanyName,
(
SELECT TOP(1) WebSite FROM Table2
WHERE CompanyName = data.CompanyName
AND CountryFk = data.CountryFk
AND WebSite IS NOT NULL
) AS WebSite
FROM
(
SELECT CountryFk, CompanyName FROM Table1
UNION
SELECT CountryFk, CompanyName FROM Table2
) data
WHERE
NOT EXISTS
(
SELECT * FROM MasterTable
WHERE CompanyName = data.CompanyName AND CountryFk = data.CountryFk
)
GROUP BY
CountryFk,
CompanyName
INSERT INTO masterTable(CountryFk, CompanyName, WebSite)
SELECT CountryFk, CompanyName, min(WebSite)
FROM Table2
group by CountryFk, CompanyName;
INSERT INTO masterTable(CountryFk, CompanyName)
SELECT distinct CountryFk, CompanyName
FROM Table1
LEFT JOIN masterTable
on masterTable.CountryFk = Table1.CountryFk
and masterTable.CompanyName = Table1.CompanyName
where masterTable.CountryFk is null;
Table1
-> Id, CountryFk, CompanyNameTable2
-> Id, CountryFk, CompanyName, Website
我需要将 Table1
和 Table2
合并为 1 个主 table。我知道这可以通过类似下面的查询来完成 -
INSERT INTO masterTable(Id, CountryFk, CompanyName)
SELECT * FROM Table1
UNION
SELECT * FROM Table2;
但是,我在 table2
中有一个额外的列 website
,而 table1
中没有。 masterTable
我需要这个专栏。
更重要的是,Table1
和 Table2
有重复的公司 countryFK
。例如,countryFK=123
处的 IBM
可能在 Table1
中出现两次。 Table1
可能有一个 companyName
出现在 Table2
中。
例如:countryFk = 123
的 IBM
可能出现在 table1
和 table2
中。我需要确保 masterTable
没有任何重复的公司。
请注意,公司名称本身不必是唯一的。 masterTable
可以 IBM
与 countryFK = 123
和 IBM
与 countryFk = 321
。
masterTable
不能 IBM
和 countryFk=123
两次。
试试这个 UNION
。
INSERT INTO masterTable(Id, CountryFk, CompanyName,Website)
SELECT Id, CountryFk, CompanyName, "Website" as Website FROM Table1
UNION
SELECT Id, CountryFk, CompanyName, Website FROM Table2 WHERE CompanyName NOT IN(SELECT CompanyName FROM Table1);
或
一次,您已将两个 table 数据合并到主 table 中,然后您可以查找重复数据并将其删除
;WITH cte
AS (SELECT ROW_NUMBER() OVER (PARTITION BY CountryFk, CompanyName
ORDER BY ( SELECT 0)) RN
FROM MyTable)
DELETE FROM cte
WHERE RN > 1
这可能有效
INSERT INTO masterTable(Id, CountryFk, CompanyName,Website)
SELECT Id, CountryFk, CompanyName, NULL as Website FROM Table1
UNION
SELECT Id, CountryFk, CompanyName,Website FROM Table2;
恕我直言,如果您需要确保 CompanyName
和 CountryFk
在 MasterTable 中不重复,您应该在该列上添加唯一索引。
下面的查询选择 Table1 和 Table2 中的所有不同值,并插入并检查 CompanyName
和 CountryFk
。
-- Id is identity, no need to insert value
INSERT MasterTable (CountryFk, CompanyName, WebSite)
SELECT
CountryFk,
CompanyName,
(
SELECT TOP(1) WebSite FROM Table2
WHERE CompanyName = data.CompanyName
AND CountryFk = data.CountryFk
AND WebSite IS NOT NULL
) AS WebSite
FROM
(
SELECT CountryFk, CompanyName FROM Table1
UNION
SELECT CountryFk, CompanyName FROM Table2
) data
WHERE
NOT EXISTS
(
SELECT * FROM MasterTable
WHERE CompanyName = data.CompanyName AND CountryFk = data.CountryFk
)
GROUP BY
CountryFk,
CompanyName
INSERT INTO masterTable(CountryFk, CompanyName, WebSite)
SELECT CountryFk, CompanyName, min(WebSite)
FROM Table2
group by CountryFk, CompanyName;
INSERT INTO masterTable(CountryFk, CompanyName)
SELECT distinct CountryFk, CompanyName
FROM Table1
LEFT JOIN masterTable
on masterTable.CountryFk = Table1.CountryFk
and masterTable.CompanyName = Table1.CompanyName
where masterTable.CountryFk is null;