这是两张桌子。我想根据两个表中的信息更新(而不是选择)第一个表。
第一个名为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个字符串代替一个字符串(在某些城市中添加3行)。
2)下一个城市(第二个和最后一个城市)-HrodnaHrodna在所有城市中只满足一次,因此我们不会向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。
可以在一个查询中完成吗?两个问题作为答案也将被接受。
我解释清楚了吗?
谢谢您。

最佳答案

您需要插入查询,可以使用以下方法:

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

请参见fiddlehere
这将插入来自所有城市的所有行,这些城市不在某些城市(或具有相同名称但不同国家或地区)中,因为我使用的左连接的WHERE s.name为空。
然后我选择城市的名称和在某些城市中出现的Info2列,并对名称进行内部连接,以便只返回在某些城市中出现过至少一次的行。

10-06 03:10