#sql #datetime #union #snowflake-cloud-data-platform #full-outer-join
#sql #дата и время #объединение #snowflake-cloud-data-platform #полное внешнее соединение
Вопрос:
У меня есть два почти идентичных набора данных, которые я пытаюсь объединить, но я хочу объединить их только в том случае, если в файле 1 для этого уже нет даты.
Набор данных 1
Файл | Дата | Тип |
---|---|---|
1 | 1/1/2020 | a |
1 | 1/2/2020 | b |
1 | 1/3/2020 | c |
Набор данных 2
Файл | Дата | Тип |
---|---|---|
2 | 1/1/2020 | a |
2 | 1/2/2020 | b |
2 | 1/3/2020 | c |
2 | 1/4/2020 | d |
Идеальный результат
Файл | Дата | Тип |
---|---|---|
1 | 1/1/2020 | a |
1 | 1/2/2020 | b |
1 | 1/3/2020 | c |
2 | 1/4/2020 | d |
Если оба набора данных имеют одинаковые даты, то я хочу использовать только данные из файла # 1
SELECT FILE, DATE, TYPE FROM TABLE A
UNION
SELECT FILE, DATE, TYPE FROM TABLE B
[настройка] https://www.db-fiddle.com/f/whfZGwnAJcAYaQii6avF6k/1
Ответ №1:
Вы описываете full join
. Ответ Popeye работает и является типичным подходом в базах данных, которые не поддерживают синтаксис. Но Snowflake делает это, поэтому запрос проще и эффективнее формулируется как:
select coalesce(t1.file, t2.file) as file, date, coalesce(t1.type, t2.type) as type
from t1
full outer join t2 using (date)
Комментарии:
1. Есть ли более простой способ сделать это, если имеется более 10 столбцов, или мне нужно обернуть объединение вокруг каждого столбца и псевдонима?
2. @andaman: нет, вам нужно
coalesce()
для этого.
Ответ №2:
Вы можете использовать union all
со not exists
следующим:
SELECT DISTINCT FILE, DATE, TYPE FROM TABLEA
UNION
SELECT DISTINCT FILE, DATE, TYPE FROM TABLEB B
WHERE NOT EXISTS
(SELECT 1 FROM TABLEA A
WHERE A.DATE = B.DATE
AND A.TYPE = B.TYPE)
Примечание: я использовал distinct
, чтобы сделать логику похожей на union, поскольку она удаляет дубликат. Вы можете удалить distinct
из своего запроса, если у вас нет дубликатов в ваших отдельных таблицах.