繁体   English   中英

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

[英]SQL - Replace column values with another table column ONLY where they match, else keep original value?

我很难弄清楚如何以有效的方式完成我在标题中描述的事情。 这个问题用词相当复杂,所以我只提供一个例子:

我有 2 个表 - 一个是国家名称的查找表,另一个包含国家/地区的计数。 问题是,第二个表搞砸了,现在在同一列中同时包含国家/地区的 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     |

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM