繁体   English   中英

将数据从两个相似的表插入到SQL Server中的一个主表中

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

  • Table1 > ID,CountryFk,CompanyName
  • Table2 > ID,CountryFk,CompanyName,网站

我需要将Table1Table2合并到1个主表中。 我知道这可以通过以下查询来完成-

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

但是,我在table2有一个额外的列,即table1没有的website 我需要masterTable此列。

更重要的是, Table1Table1 Table2重复公司具有相同的countryFK 例如, Table1两次出现了countryFK=123 IBM Table1可以有一个companyName存在于Table2

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

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

masterTable 不能两次使用countryFk=123 IBM

恕我直言,如果你需要保证双方CompanyNameCountryFk在MasterTable不能重复,你应该在列中添加唯一索引。

下面的查询选择表1和表2中的所有不同值,并插入对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(Id, CountryFk, CompanyName,Website)
   SELECT Id, CountryFk, CompanyName, NULL as Website FROM Table1
   UNION
   SELECT Id, CountryFk, CompanyName,Website FROM Table2; 

尝试此操作以获得适当的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);

要么

一次,将两个表数据合并到主表中,然后可以查找重复数据并将其删除

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM