База данных Oracle — как я могу объединить эти две таблицы, чтобы предложение where просматривало несколько значений?

#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 . Это решение наиболее близко к тому, что вы делали в своем решении — это точка зрения Гордона, он предоставил решение, которое больше всего напоминает то, что вы уже сделали.