首页 > 解决方案 > 将数据从一个表插入到另一个表中,其中一列有效地匹配两者

问题描述

我有两个表,“BLANKTABLE”和“ACTIVETABLE”。它们具有相同的列“公司、城市、州”。活动表每列有数百万条记录,BLANK 表只填写了“公司”列(其他列为空)。两者之间有很大的重叠。

我想将 ACTIVETABLE 中的行数据(城市和州)插入到 BLANKTABLE 中,其中公司字段在两者上都匹配。因此,如果两个表的公司列中都有公司“示例”,它会将 ACTIVE 中的城市和州数据插入到 BLANK 中,基本上从 ACTIVE 中克隆该行。我的第一个想法是这个,但我觉得它的效率非常低。

INSERT INTO BLANKTABLE
  (Company, [City], [State])
SELECT de.company,
       de.[city],
       de.[state]
  FROM [ACTIVETABLE] de
 WHERE EXISTS(SELECT website, company, zip
                    FROM BLANKTABLE d2
                   WHERE d2.company = de.company)

有什么想法吗?

更新:

实际上,也许这就是方式

UPDATE blanktable
SET    blanktable.city = activetable.city,
       blanktable.state = activetable.state
FROM   blanktable d2
       INNER JOIN activetable de
               ON d2.company = de.company; 

正确的?

标签: sqlsql-serverdatabase

解决方案


在我看来,任何公司都有多个 ActiveTable 行,您想按公司进行汇总,然后更新 BlankTable(如果您在 ActiveTable 中找到位于 BlankTable 中的公司,则可能添加到 BlankTable)。

如果您使用 Merge 语句而不是 Update 或 Insert,我认为整个过程对您来说会更清楚一些。 您可以在此处阅读有关语法的信息

基本上,这里重要的是设计一个针对 ActiveTable 的查询,该查询返回每家公司的一行,其中包含您希望在 BlankTable 中拥有的城市和州的特定值。如果您有可以区分的数据,我建议您使用最新的 ActiveTable 值。您可以填写空白,但基本语法是:

Merge into Blanktable b
Using (Select <company city state values> From activeTable Group By company) a
On B.company = A.company
When Matched Then Update Set b.city = a.city, b.state=a.state
When Not Matched Then Insert (company,city,state) Values (a.company, a.city, a.state)

如果公司存在于 BlankTable 中,则此完整语法更新;如果公司不存在,则插入。如果您不想将记录添加到 BlankTable,只需更新现有记录,然后省略 When Not Matched 部分。


推荐阅读