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

时间:2015-08-03 05:03:23

标签: sql sql-server tsql sql-server-2008-r2

  • Table1 - > Id,CountryFk,CompanyName
  • Table2 - > Id,CountryFk,CompanyName,网站

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

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

但是,我在website中有一个额外的列table2table1中没有。{1}}。我在masterTable中需要此列。

更重要的是,Table1Table2重复公司具有相同的countryFK。例如,IBM的{​​{1}}可能会在countryFK=123中出现两次。 Table1 Table1中可能有companyName Table2

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

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

IBM 无法 countryFk=123 function change() { ... } change(); 两次。

4 个答案:

答案 0 :(得分:2)

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

下面的查询选择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    

答案 1 :(得分: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; 

答案 2 :(得分:0)

尝试使用正确的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

答案 3 :(得分:0)

var indices = function(find, where) {
  var arr = [];
  for (var i = 0, l = where.length; l > i; i++)
    if (find === where[i])
      arr.push(i);
  return arr;
};

alert(indices("l", "Hello World")); // [2, 3, 9]