2013-10-30 80 views
1

以下是两个表。我想根据两个表中的信息更新(不选择)第一个表。MySQL:根据来自A和B表的数据更新表A

第一个表命名somecities

Name - State - Country - Info1 - Info2 
Orlando - FL - US - 123 -AAA 
Hrodna - HV - BY - 890 -BBB 

命名allcities第二张表:

Name - State - Country - Info1 
Orlando - FL - US - 123 
Orlando - KY - US - 456 
Orlando - WV - US - 789 
Orlando - SW - SA - 333 
Hrodna - HV - BY - 890 
Minsk - MV - BY - 199 

任何从somecities表对(姓名,省,国家)的是在allcities表,如果它很重要。所以,allcities表更大。

我想修改somecities这样:

1)坐第一排,采取Orlando。它会在allcities中遇到4次。所以,制作4个奥兰多线而不是1个(向3个城市增加3个)。

2)走下一个城市(第二个和最后一个) - HrodnaHrodna在allcities中仅遇到一次,所以我们不会向somecities添加任何行(添加零行)。

3)在somecities的每一行都做。

查询的结果是更新somecities

Name - State - Country - Info1 - Info2 
Orlando - FL - US  - 123 - AAA 
Orlando - KY - US  - 456 - AAA 
Orlando - WV - US  - 789 - AAA 
Orlando - SW - SA  - 333 - AAA 
Hrodna - HV - BY  - 890 - BBB 

附:如您所见,Info2中的值取自Info2中同一城市的值。

它可以在一个查询中完成吗?两个查询作为答案也将被接受。

我解释清楚了吗?

谢谢。

+0

你会想要使用不存在,我会敲SQL提琴的例子 – twoleggedhorse

+0

这听起来像你想'INSERT''而不是''更新''somecities''表。你想以任何方式改变现有的行吗? – acfrancis

+0

你是对的。谢谢你指出。是的,现有的行不会更改。所以我想通过插入几行来更新somecities表。 – Haradzieniec

回答

2

你需要一个INSERT查询,你可以使用这样的事情:

INSERT INTO somecities 
SELECT a.*, si.Info2 
FROM 
    allcities a LEFT JOIN somecities s 
    ON a.Name=s.Name AND a.State=s.State AND a.Country=s.Country 
    INNER JOIN (SELECT DISTINCT Name, Info2 
       FROM somecities) si 
    ON a.Name=si.Name 
WHERE 
    s.Name IS NULL 

请参阅小提琴here

这将插入allcities中不存在于somecities中(或具有相同名称但不同状态或国家)的所有行,因为我使用了LEFT JOIN和WHERE s.Name IS NULL。

然后,我选择城市的名称和InfoC2列在somecities中存在,我只是在名称上进行INNER JOIN,以便只返回存在于某些城市中的行至少一次。

+0

看起来像它的工作(只做了几个测试,没有发现错误)。如果有人发现任何错误,请在这里告诉我。无论如何,你已经度过了我的一天。非常感谢你。您是如何在不到一周的时间内创建此查询的? :) 谢谢。 – Haradzieniec

1

您可以使用NOT EXISTS来测试已经不在你的表中的记录,然后做一个快速的加入来从现有的记录INFO2:

SQL Fiddle demo

INSERT INTO somecities (Name,State,Country,Info1, Info2) 
SELECT data.Name,data.State,data.Country,data.Info1,inf.Info2 
FROM (
    SELECT * 
    FROM allcities a 
    WHERE NOT EXISTS (SELECT * 
         FROM somecities s 
         WHERE s.name = a.name 
          AND s.state = a.state 
          AND s.country = a.country 
          AND s.info1 = a.info1 
        ) 
) data 
    INNER JOIN (SELECT DISTINCT Name, Info2 FROM somecities) inf 
    ON data.name = inf.name; 

我个人觉得更容易阅读EXISTSNOT EXISTS而不是大量的加入,但这是个人喜好,请选择。

+0

也适用! – Haradzieniec

相关问题