SQL - Заменить значения столбца другим столбцом таблицы ТОЛЬКО там, где они совпадают, иначе оставить исходное значение? - PullRequest
0 голосов
/ 17 января 2020

Мне трудно понять, как эффективно сделать то, что я описал в названии. Вопрос довольно сложный для формулировки, поэтому я просто приведу пример:

У меня есть 2 таблицы - одна представляет собой справочную таблицу для названий стран, а другая содержит количество стран. Проблема в том, что 2-я таблица выросла на ** **, и теперь в том же столбце есть и идентификаторы, и названия страны, например:

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

Я использовал 1-ю таблицу в качестве ищите и замените идентификаторы фактическими именами, используя простой INNER JOIN. Однако в этой ситуации я не могу.

Я обошел проблему с этим запросом, но он неэффективен, потому что он анализирует данные дважды:

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

Как я могу упростить его? и эффективнее?

1 Ответ

0 голосов
/ 17 января 2020

Присоединяйтесь к таблицам и используйте выражение 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)  

Возможно, вы сможете перейти на ВНУТРЕННЕЕ объединение в зависимости от ваших данных и требований. Смотрите демо (для MySql, но это стандарт SQL). Результаты

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