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

问题描述 投票:0回答:1

我很难确定如何有效地执行标题中所述的操作。这个问题用词组来说相当复杂,因此我仅举一个例子:

我有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

如何使它更简单,更有效?

sql presto amazon-athena
1个回答
0
投票

加入表并使用如下所示的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联接。参见demo(对于MySql,但这是标准SQL)。结果

| country_id | count |
| ---------- | ----- |
| Italy      | 4     |
| France     | 4     |
| Spain      | 2     |
| Norway     | 1     |
© www.soinside.com 2019 - 2024. All rights reserved.