Как объединить набор данных с определенным правилом

#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 из своего запроса, если у вас нет дубликатов в ваших отдельных таблицах.