ЗНАЧЕНИЯ SQL и МАКСИМУМ в таблицах

#sql #db2

Вопрос:

У меня проблема с запросом базы данных DB2. У нас есть три таблицы, каждая со своей собственной «отметкой времени последнего обновления» (LST_UPDT_TS). Нам нужно упорядочить таблицу по этой метке времени, используя самую последнюю, найденную в любой из трех таблиц. Насколько я могу судить, рекомендуемый метод заключается в создании миниатюрной внутренней таблицы с использованием «ЗНАЧЕНИЙ» и выборе последней, рассматривая ее как метку времени для объединенной записи.

 SELECT  a.CUST_ID as CUSTOMER_ID,  (  SELECT MAX(LST_UPDT_TS)  FROM ( VALUES(  (a.LST_UPDT_TS),  (b.LST_UPDT_TS),  (c.LST_UPDT_TS)  ) as VALUE(LST_UPDT_TS)  )  ) as LST_UPDT_TS FROM TableA as a JOIN TableB as b ON b.CUST_ID = a.CUST_ID JOIN TableC as c ON c.CUST_ID = a.CUST_ID  

Из того, что я могу сказать из других решений, которые я нашел здесь, в StackOverflow, это правильный формат для использования команд SELECT и VALUES, но вместо получения одного наибольшего значения я получаю…

SQL0104N Неожиданный токен токена «(» был найден после «(«. Ожидаемые токены могут включать: «. ПРИСОЕДИНЯЙТЕСЬ К ВНУТРЕННЕМУ ЛЕВОМУ ПРАВОМУ ПОЛНОМУ КРЕСТУ». SQLSTATE=42601 (#-104)

Любая помощь будет признательна.

Спасибо!

Комментарии:

1. Почему бы просто не использовать MAX (a.LST_UPDT_TS, b.LST_UPDT_TS, c.LST_UPDT_TS) вместо этого подвыборку?

2. Марк — Если быть откровенным, я не очень хорошо разбираюсь в SQL, несмотря на то, что мне приходится его довольно часто использовать. Я обеспокоен, потому что я забыл, что все таблицы довольно большие, и мне нужно сделать результаты партиями по 1000 для отправки в удаленную запрашивающую программу. Будет ли это решение работать, когда мне нужно выполнить «и (комбинированный максимальный ts) gt; «(последний ts предыдущей партии) заказ по (комбинированному ts) ASC, чтобы получить только первые 1000 строк»?

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

4. Большое вам спасибо!!

Ответ №1:

Может быть, что-то вроде этого?

 SELECT CUSTOMER_ID,MAX(LST_UPDT_TS)LST_UPDT_TS  from( SELECT a.CUST_ID as CUSTOMER_ID,MAX(a.LST_UPDT_TS) LST_UPDT_TS FROM TableA as a group by a.CUST_ID  UNION SELECT b.CUST_ID as CUSTOMER_ID,MAX(b.LST_UPDT_TS) LST_UPDT_TS FROM TableB as b group by b.CUST_ID  UNION SELECT c.CUST_ID as CUSTOMER_ID,MAX(c.LST_UPDT_TS) LST_UPDT_TS FROM TableC as c group by c.CUST_ID  ) d GROUP BY CUSTOMER_ID ORDER BY 2 DESC FETCH FIRST ROW ONLY