SQL - 仅在匹配的地方用另一个 table 列替换列值,否则保留原始值?
SQL - Replace column values with another table column ONLY where they match, else keep original value?
我很难弄清楚如何以有效的方式执行我在标题中描述的内容。这个问题比较复杂,所以我只举个例子:
我有 2 个 tables - 一个是查找 table 国家名称,另一个保存国家计数。问题是,第二个 table 搞砸了,现在在同一列中既有 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
我曾经使用第一个 table 作为查找,并使用简单的 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 联接。
请参阅 demo(对于 MySql 但它是标准的 SQL)。
结果
| country_id | count |
| ---------- | ----- |
| Italy | 4 |
| France | 4 |
| Spain | 2 |
| Norway | 1 |
我很难弄清楚如何以有效的方式执行我在标题中描述的内容。这个问题比较复杂,所以我只举个例子:
我有 2 个 tables - 一个是查找 table 国家名称,另一个保存国家计数。问题是,第二个 table 搞砸了,现在在同一列中既有 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
我曾经使用第一个 table 作为查找,并使用简单的 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 联接。
请参阅 demo(对于 MySql 但它是标准的 SQL)。
结果
| country_id | count |
| ---------- | ----- |
| Italy | 4 |
| France | 4 |
| Spain | 2 |
| Norway | 1 |