#oracle #oracle11g #oracle12c
#Oracle #oracle11g #oracle12c
Вопрос:
У меня есть две таблицы A и B.
- Таблица содержит данные за 3 месяца (будут добавляться каждый день, чтобы по прошествии месяцев добавлялось больше данных и за ближайшие месяцы)
таблица amp; B содержит данные за 12 месяцев (за полный год).
Возможно, что в таблице A могут отсутствовать данные за месяц, например, в моем случае у Jan нет данных для одного идентификатора, но для Feb у него есть некоторые данные для того же идентификатора.
Когда я беру левое соединение, мне не хватает данных для идентификатора 1 за январь из таблицы 2, поскольку в таблице нет данных для идентификатора 1.
Когда я выполняю правильное объединение, я получаю данные за 12 месяцев для таблицы 2, поэтому применил условие объединения month(table A. date)=month(table B. date)
в этом случае также я теряю данные для идентификатора 1 из table2.
Мое требование — получить данные как из table1, так и из table2 за месяцы в table1, и если в таблице нет данных за определенный месяц (например, за январь), то мне также нужны данные за январь из table2.
Таблица 1
ID Date value
1 01-Feb-2019 100
2 01-Jan-2019 101
2 01-Feb-2019 102
Таблица 2
ID Date value
1 01-Jan-2019 101
1 01-Feb-2019 100
1 01-Mar-2019 100
2 01-Jan-2019 101
2 01-Jan-2019 101
2 01-Feb-2019 102
2 01-Mar-2019 100
.
.
.
This continues till dec 2019
Здесь, в приведенном выше примере данных, я не получаю данные за январь из таблицы 2.
Ожидаемый результат:
ID Jan Feb Mar
1 101 201 100 //Here Jan value from table2
2 201 204 100
Комментарии:
1. Каков ваш ожидаемый результат? Покажите это в табличной форме
2. @KaushikNayak пожалуйста, проверьте мою правку
3. Итак, что, если для данного идентификатора и месяца
value
отличается между таблицами 1 и таблицей 2? они всегда будут одинаковыми?4. значением @KaushikNayak может быть любое случайное значение, просто нужны данные, хотя в таблице 1 нет никакой записи за месяц в таблице 2
5. Хорошо, на мгновение, глядя на ваш ожидаемый результат, я подумал, что вы суммируете значения table1 и table2. похоже, что это не так..
Ответ №1:
Попробуйте UNION
вместо:
select * from table A where Date between to_date('2019-01-01 00:00:00', 'YYYY.MM.DD HH24:MI:SS') and to_date('2019-01-31 23:59:59', 'YYYY.MM.DD HH24:MI:SS')
union
select * from table B where Date between to_date('2019-01-01 00:00:00', 'YYYY.MM.DD HH24:MI:SS') and to_date('2019-01-31 23:59:59', 'YYYY.MM.DD HH24:MI:SS');
Комментарии:
1. как работает объединение в этом случае, не могли бы вы, пожалуйста, помочь мне с несколькими строками описания
2. Моя ошибка, не объединение ВСЕХ, просто ОБЪЕДИНЕНИЕ. Суть в том, что вы выбираете все необходимые вам данные из таблиц B и A и объединяете их с помощью UNION, который удаляет дубликаты.
3. Спасибо за разъяснение, на данный момент я не могу использовать union, есть ли у них какой-либо другой способ добиться того же?
4. Почему вы не можете это использовать? Существуют ли какие-либо особые требования?
5. Спасибо за объяснение, причина, по которой я не могу использовать объединение, заключается в том, что я реализую в tableau, где я не вижу опции объединения, но фон тот же, поэтому спросил вас, есть ли у них какой-либо другой вариант
Ответ №2:
Не уверен, как вы извлекаете значения, поскольку вы не показали фактический запрос, который выдает ожидаемый результат.
Этот запрос, похоже, работает нормально, т. Е. он выдает то, что вы хотели изначально.
select t2.id,t2.dt,coalesce(t1.value,t2.value) as value
from t2 LEFT JOIN t1 ON
to_char(t1.dt,'yyyymm') = to_char(t2.dt,'yyyymm') and
t1.id = t2.id
ORDER BY id,dt
Если вы добавите DISTINCT
, вы получите одну запись на id,month
комбинацию, если хотите удалить дубликаты. Вы также можете сделать group by id
или что угодно, чтобы получить агрегацию
Обратите внимание, что приведенное ниже приведено только в том случае, если вы хотите предпочесть значение таблицы 1 таблице 2, иначе простого выбора строк из t2 будет достаточно
coalesce(t1.value,t2.value) as value
Комментарии:
1. Спасибо, Каушик, да, вы правы, я не опубликовал запрос, потому что я манипулирую всем процессом в Tableau и где я не получаю ожидаемые данные из-за упомянутых проблем, поэтому планирую настроить с использованием логики SQL, поэтому не могу предоставить полную информацию, Спасибо за вашу помощь, я внедрю и обновлю вам результаты
Ответ №3:
Если у вас есть такого рода ограничения в ваших инструментах запросов, возможно, было бы лучше создать представление в базе данных, объединяющее таблицы, а затем запросить представление.
create view A_B as
выберите идентификатор, значение даты из таблицы A
объединение
выберите идентификатор, значение даты из таблицы B;