Как объединить таблицы, сравнив два поля, а также учитывая производительность

Это должно быть просто, но я не могу этого понять. Мне нужно сделать выбор, чтобы получить более новые значения даты для некоторых учетных записей.

Я начинаю здесь, Т1:

+----------+---------+
|  date   | account |
+----------+---------+
| 4/1/2018 |       1 |
| 4/1/2018 |       2 |
| 4/1/2018 |       3 |
| 4/1/2018 |       4 |
| 4/1/2018 |       5 |
+----------+---------+

Затем некоторые даты обновляются в T2:

+----------+---------+
|   date   | account |
+----------+---------+
| 7/1/2018 |       1 |
| 7/1/2018 |       2 |
+----------+---------+

Как я могу передать этот вывод в T3, обновив только эти учетные записи?

+----------+---------+
|   date   | account |
+----------+---------+
| 7/1/2018 |       1 |
| 7/1/2018 |       2 |
| 4/1/2018 |       3 |
| 4/1/2018 |       4 |
| 4/1/2018 |       5 |
+----------+---------+

Я могу присоединиться к номеру учетной записи, но как насчет тех, которые не изменились? Как их запечатлеть?

Кроме того, у T1 около 8 миллионов записей, поэтому производительность будет важным фактором. Извлечение из Teradata, загрузка в Hive.

Спасибо!

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
0
141
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я думаю, ты хочешь:

select t2.*
from t2
union all
select t1.*
from t1
where not exists (select 1 from t2 where t2.account = t1.account);

Это выбирает первым из t2. Потом забирает оставшиеся аккаунты с t1.

Вот еще одно решение с левым внешним соединением:

select t1.Account, case when t2.Date is null then t1.Date else t2.Date end
from t1
left outer join t2 on t2.Account = t1.Account

Просто дополнение к ранее хорошим ответам ... попробуйте также использовать его с coalesce и дайте мне знать, улучшит ли он производительность.

select t1.Account, coalesce(t2.Date, t1.Date) 
from t1
left outer join t2
  on t2.Account = t1.Account

Это не улучшит производительность по сравнению с CASE, но его синтаксис короче и чище.

dnoeth 27.10.2018 11:30

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

vikrant rana 30.10.2018 06:12

Другие вопросы по теме