将来自两个相似 table 的数据插入 Sql 服务器中的一个主 table

Inserting data from two similar tables into one master table in Sql Server

我需要将 Table1Table2 合并为 1 个主 table。我知道这可以通过类似下面的查询来完成 -

   INSERT INTO masterTable(Id, CountryFk, CompanyName)
   SELECT * FROM Table1
   UNION
   SELECT * FROM Table2; 

但是,我在 table2 中有一个额外的列 website,而 table1 中没有。 masterTable 我需要这个专栏。

更重要的是,Table1Table2 有重复的公司 countryFK。例如,countryFK=123 处的 IBM 可能在 Table1 中出现两次。 Table1 可能有一个 companyName 出现在 Table2 中。

例如:countryFk = 123IBM 可能出现在 table1table2 中。我需要确保 masterTable 没有任何重复的公司。

请注意,公司名称本身不必是唯一的。 masterTable 可以 IBMcountryFK = 123IBMcountryFk = 321

masterTable 不能 IBMcountryFk=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; 

恕我直言,如果您需要确保 CompanyNameCountryFk 在 MasterTable 中不重复,您应该在该列上添加唯一索引。

下面的查询选择 Table1 和 Table2 中的所有不同值,并插入并检查 CompanyNameCountryFk

-- 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;