SQL - 仅在它们匹配的地方用另一个表列替换列值,否则保留原始值?



我很难弄清楚如何以有效的方式完成我在标题中描述的内容。这个问题说起来相当复杂,所以我只举一个例子:

我有 2 个表 - 一个是国家名称的查找表,另一个包含国家/地区计数。问题是,第二个表被 f**k 搞砸了,现在在同一列中同时有 ID 和国家/地区名称,如下所示:

Table_1: countries
country_id | name
------------+------
0000    | Italy
0001    | France
0002    | Spain
0003    | Norway
Table_2: country_count
country_id | count
------------+------
Italy   |   4
0001    |   4
0002    |   2
Norway  |   1

我曾经使用第一个表作为查找,并使用简单的INNER JOIN将 ID 替换为实际名称。但是,在这种情况下,我不能。

我解决了这个查询的问题,但它效率低下,因为它解析了两次数据:

SELECT cs.name, cc.count
FROM country_count cc
INNER JOIN countries cs ON cc.country_id = cs.country_id
UNION ALL
SELECT country_id name, count
FROM country_count
WHERE country_id NOT IN (SELECT country_id FROM countries)
ORDER BY count DESC
which returns the wanted result, like this:
name    | count
------------+------
Italy   |   4
France  |   4
Spain   |   2
Norway  |   1

如何使其更简单、更高效?

联接表并使用如下所示的CASE表达式:

select 
case when cc.country_id = c.name then cc.country_id else c.name end country_id,
cc.count
from country_count cc left join countries c
on cc.country_id in (c.country_id, c.name)  

也许您可以根据您的数据和要求更改为 INNER 联接。
请参阅演示(适用于MySql,但它是标准SQL(。
结果

| country_id | count |
| ---------- | ----- |
| Italy      | 4     |
| France     | 4     |
| Spain      | 2     |
| Norway     | 1     |

相关内容

  • 没有找到相关文章

最新更新