Как объединить две таблицы в одну, а затем объединить столбец? - PullRequest
0 голосов
/ 15 января 2020

Допустим, у меня есть три таблицы в базе данных PostgreSQL. A films таблица

+-------------+----------+
|    film     | theme_id |
+-------------+----------+
| film name 1 |      23  |
| film name 2 |      56  |
| film name 3 |      11  |
| film name 4 |      12  |
+-------------+----------+

a themes_old таблица

+----------+------------+
| theme_id | streams_on |
+----------+------------+
|       23 | Spotify    |
|       56 | Tidal      |
+----------+------------+

и таблица themes_new

+----------+------------+
| theme_id | streams_on |
+----------+------------+
|       11 | Spotify    |
|       56 | Tidal      |
+----------+------------+

Я хочу присоединиться ко второму и третьи таблицы к первой, но без повторного столбца streams_on. Например, если бы я запустил

SELECT * 
FROM films as f 
LEFT JOIN themes_old as to ON f.theme_id=to.theme_id 
LEFT JOIN themes_new as tn on f.theme_id=tn.theme_id

, я бы получил

+-------------+----------+------------+------------+
|    film     | theme_id | streams_on | streams_on |
+-------------+----------+------------+------------+
| film name 1 |       23 | Spotify    | [null]     |
| film name 2 |       56 | Tidal      | Tidal      |
| film name 3 |       11 | [null]     | Spotify    |
| film name 4 |       12 | [null]     | [null]     |
+-------------+----------+------------+------------+

Но я хочу объединить последние два столбца так, чтобы был только один столбец streams_on, такой что для любой строки, если один streams_on значение столбца равно нулю, возьмите другое, если оба значения не равны нулю, возьмите, возможно, первое и если оба значения равны нулю, то по умолчанию используется значение ноль. Это должно привести к следующей таблице:

+-------------+----------+------------+
|    film     | theme_id | streams_on |
+-------------+----------+------------+
| film name 1 |       23 | Spotify    |
| film name 2 |       56 | Tidal      |
| film name 3 |       11 | Spotify    |
| film name 4 |       12 | [null]     |
+-------------+----------+------------+

Я чувствую, что это работа для самостоятельного объединения или что-то в этом роде, но я не могу найти много путем поиска. Любые идеи? Кстати, оба столбца streams_on должны рассматриваться как перечисления.

Ответы [ 3 ]

2 голосов
/ 15 января 2020

Вы можете использовать COALESCE для объединения двух значений столбца:

SELECT f.film, f.theme_id, COALESCE(to.streams_on, tn.streams_on) AS streams_on
FROM films as f 
LEFT JOIN themes_old as to on f.theme_id=to.theme_id 
LEFT JOIN themes_new as tn on f.theme_id=tn.theme_id

Если вы хотите расставить приоритеты «новых» потоков над «старыми», просто измените порядок значений в COALESCE т.е.

COALESCE(tn.streams_on, to.streams_on) AS streams_on
0 голосов
/ 15 января 2020

Это можно сделать с помощью функции isnull. Я использовал SQLserver для этого решения. Он проверяет тему, доступную в новой таблице, если не использует старую тему. Дайте мне знать, если это поможет вам.

select  f.film_name, 
    isnull(new.theme_id,old.theme_id), 
    isnull(new.streams_on, old.streams_on) 
    from films f 
            left join themes_old old 
                on f.theme_id = old.theme_id 
            left join themes_new new 
                on f.theme_id = new.theme_id
0 голосов
/ 15 января 2020

Я бы предложил использовать Case Case хотя бы потому, что вы можете добавить значение, которое будет отображаться вместо нулевого значения. Упрощает быстрый экспорт информации в отчеты

SELECT 
theme_id,
CASE
WHEN themes_new.streams_on IS NOT NULL THEN themes_new.streams_on
WHEN (themes_new.streams_on IS NULL AND themes_old.streams_on IS NULL) THEN "None"
ELSE themes_old.streams_on

FROM films as f
LEFT JOIN themes_old as to on f.theme_id=to.theme_id 
LEFT JOIN themes_new as tn on f.theme_id=tn.theme_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...