Ошибка SQL-запроса — что я делаю не так?

#android #sql #sqlite

#Android #sql #sqlite

Вопрос:

Вот ОБНОВЛЕНИЕ SQL, которое я пытаюсь выполнить:

 UPDATE T
  SET T.CurrentStopNumber = TS.CurrentStopNumber 
 FROM Trip T 
INNER JOIN (SELECT TripId, MIN(StopNumber) CurrentStopNumber
             FROM TripStop
            WHERE TripId = '106504'
              AND (IsPickup = 1 OR IsDrop = 1)
              AND StopNumber > (SELECT COALESCE(max(StopNumber), 0) 
                                  FROM TripUpdate 
                                 WHERE TripId = '106504' 
                                   AND Type = 2)) TS ON T.TripId = TS.TripId
  

Я получаю ошибку во второй строке:

  /* Error message: SQL script is wrong mismatched input . expecting "EQ" */
  

Я знаком с SQL Server и уверен, что он будет работать на SQL Server просто отлично. Подзапрос выполняется нормально и возвращает 1 строку, как я и ожидал. Мне просто нужно обновить таблицу этим значением. Что не так?

Ответ №1:

Использовать:

 UPDATE TRIP
   SET currentstopnumber = (SELECT MIN(ts.stopnumber)
                              FROM TRIPSTOP ts
                             WHERE ts.tripid = TRIP.tripid
                               AND ts.tripid = '106504'
                               AND 1 IN (ts.ispickup, ts.isdrop)
                               AND ts.stopnumber > (SELECT COALESCE(MAX(tu.stopnumber), 0)
                                                      FROM TRIPUPDATE tu
                                                     WHERE tu.tripid = ts.tripid
                                                       AND tu.type = 2)
                          GROUP BY ts.tripid)
 WHERE EXISTS (SELECT NULL 
                 FROM TRIPSTOP ts
                WHERE ts.tripid = TRIP.tripid
                  AND ts.tripid = '106504'
                  AND 1 IN (ts.ispickup, ts.isdrop)
                  AND ts.stopnumber > (SELECT COALESCE(MAX(tu.stopnumber), 0)
                                         FROM TRIPUPDATE tu
                                        WHERE tu.tripid = ts.tripid
                                          AND tu.type = 2))
  

ОБЪЕДИНЕНИЕ предпочтительнее, но синтаксис широко не поддерживается.

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

1. Похоже, соединение не поддерживается. Я сделал это, как вы предложили, за исключением того, что я изменил часть WHERE: ОБНОВИТЬ Trip SET currentstopnumber = (ВЫБЕРИТЕ MIN (StopNumber) ИЗ TripStop, ГДЕ tripID = ‘106504’ И (IsPickup = 1 ИЛИ IsDrop = 1) И StopNumber > (ВЫБЕРИТЕ COALESCE (max (StopNumber), 0) ИЗ TripUpdate, ГДЕ tripID = ‘106504’ И Type = 2) ) ГДЕ tripID = ‘106504’

Ответ №2:

Я не думаю, что вам следует указывать таблицу для заданных вами полей, поскольку база данных уже знает, какую таблицу обновлять:

 SET CurrentStopNumber = TS.CurrentStopNumber
  

(IIRC, это также не разрешено в SQL Server.)

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

1. Это работает в SQL Server и сейчас не работает, даже если я удалил его.