iSeries Access v5.8 - SQL для обновления записей для одного клиента, кроме последней записи?

Я относительно новичок в SQL и мне нужно составить инструкцию UPDATE для таблицы.

(Я начинаю с оператора SELECT и, убедившись, что он работает, создаю оператор UPDATE.)

Итак, у меня есть одна таблица КОНТРАКТЫ, каждая строка представляет один контракт. У клиента может быть несколько контрактов на столе, но номера контрактов всегда увеличиваются на единицу.

Я хочу выбрать все контракты, кроме последних (т. Е. С наибольшим количеством контрактов) для каждого клиента. (Эти строки я буду обновлять)

я пробовал

SELECT * From Contracts T1
WHERE EXISTS
(Select * from Contracts T2 WHERE
T1.CUST = T2.CUST AND T2.CONTRACTNUMBER < MAX(T1.CONTRACTNUMBER))

Но зеленый экран говорит мне, что использование MAX недопустимо.

Я, должно быть, ошибаюсь в синтаксисе - любая помощь ?!


person JungleJme    schedule 11.11.2013    source источник


Ответы (2)


Вы можете заключить несколько полей вместе в круглые скобки, чтобы сравнивать их со строками в другом наборе.

SELECT c.*
  FROM contracts c
  WHERE (c.cust, c.contractnbr) not in
    (SELECT m.cust, max(m.contractnbr)
       FROM contracts m
       GROUP BY cust
    )

Эта концепция, вероятно, наиболее полезна с IN, как показано выше, но также может использоваться в других запросах к JOIN

FROM a JOIN b ON (a.x,a.y,a.z) = (b.x,b.y,b.z)
person WarrenT    schedule 11.11.2013

заменять

T2.CONTRACTNUMBER < MAX(T1.CONTRACTNUMBER)

с участием

T2.CONTRACTNUMBER NOT IN (SELECT MAX(T3.CONTRACTNUMBER)
                            from Contracts t3 
                            WHERE T3.CUST=T2.CUST) 
person Daniel E.    schedule 11.11.2013
comment
Большое спасибо, этот синтаксис сработал - неправильное использование MAX оказалось отвлекающим маневром, как и в вашем синтаксисе. Однако оказалось, что, несмотря на то, что поле «выглядит» как число, на самом деле оно хранится в виде строки, поэтому мне пришлось обернуть поле с помощью CAST, и это отсортировало его! - person JungleJme; 11.11.2013
comment
Посмотрите еще раз на подзапрос. Как выбрать max (t1.anything) из t3? - person WarrenT; 11.11.2013
comment
забыл поменять, когда вставил то, что у него было. - person Daniel E.; 11.11.2013