#sql #oracle
#sql #Oracle
Вопрос:
Действительно не уверен, как это сформулировать. У меня есть две таблицы, t1 и t2. t1 содержит очень длинную историю сообщений, поэтому в нем есть [message, t1_id, t2_d] . t2, для примера, просто имеет t2_id . Я хочу найти сообщение, сопоставленное с наивысшим значением t1_id. Это просто
select message
from t1
where t1_id = (
select MAX(t1_id) as mx
from t1
where t2_id = 1
);
Но, как вы можете видеть, я жестко запрограммировал t2_id . Я намереваюсь, чтобы этот код (который в настоящее время просто возвращает самое высокое сообщение из одного идентификатора) выполнял ВСЕ различные идентификаторы. Есть несколько способов сделать это, но я знаю, что вы можете сделать
select t2_id
from t2;
Итак, как я могу по существу заменить жесткое кодирование приведенным выше оператором select ? Я знаю, что не могу напрямую, но даже при использовании GROUP BY мне не повезло.
Уточнение: столбец t2_id в t1 соответствует столбцу t2_id в t2. Таким образом, в t1 будет много повторений t2_id из t2. Поэтому я просто хочу, чтобы сообщение для КАЖДОГО t2_id в t1 имело наивысший t1_id. Итак, t1 содержит тысячи строк, но только около 20 разных идентификаторов t2_id, поэтому у меня должно быть 20 строк результата.
Ответ №1:
Более эффективное решение (возможно, наиболее эффективное), использующее немного более продвинутые функции.
select t2_id, -- you probably need this!
max(t1_id) as max_t1_id, -- if needed
max(message) keep (dense_rank last order by t1_id) as message
from t1
group by t2_id;
Ответ №2:
Используйте коррелированный подзапрос:
select message
from t1
where t1_id = (
select MAX(t1_id) as mx
from t1 ttt
where t1.t2_id = ttt.t2_id
);
Существуют и другие способы выражения этого запроса — использование row_number()
, keep
, join
являются типичными способами. Но в соответствии с вашей формой, коррелированный подзапрос — это один из способов.
Комментарии:
1. приношу свои извинения, если я кажусь смущенным. Разве это не вернет только одно сообщение (с наивысшим t1_id), а не самое высокое сообщение для каждого t1_id?
2. @skex — нет, это вернет один результат для каждого отдельного
t2_id
. Однако это довольно неэффективно — например, он будет вычислять одно и то жеmax(t1_id)
несколько раз для одного и того жеt2_id
. Это решение наиболее близко к тому, что вы делали в своем решении — это точка зрения Гордона, он предоставил решение, которое больше всего напоминает то, что вы уже сделали.