这是两张桌子。我想根据两个表中的信息更新(而不是选择)第一个表。
第一个名为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)下一个城市(第二个和最后一个城市)-
Hrodna
。Hrodna
在所有城市中只满足一次,因此我们不会向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列,并对名称进行内部连接,以便只返回在某些城市中出现过至少一次的行。