#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