SQL Изменить вопрос - PullRequest
       4

SQL Изменить вопрос

0 голосов
/ 19 февраля 2011

Мне нужно заменить много значений для таблицы в SQL, если бездействие превышает 30 дней.

У меня есть

UPDATE VERSION 
   SET isActive = 0
 WHERE customerNo = (SELECT c.VersionNo
                       FROM Activity b 
                      INNER JOIN VERSION c ON b.VersionNo = c.VersionNo
                      WHERE (Months_between(sysdate, b.Activitye) > 30));

Это работает только для одного значения, хотя, если есть больше, чем одно возвращаемое, это терпит неудачу. Что мне здесь не хватает?

Если бы кто-то мог рассказать мне о том, что происходит, я также был бы признателен за это.

Ответы [ 4 ]

3 голосов
/ 19 февраля 2011

Вы используете WHERE customerNo = (SELECT ...); Это работает только для 1 значения.Попробуйте использовать WHERE customerNo IN (SELECT ...);

2 голосов
/ 20 февраля 2011

Существует множество способов обработки того, что подзапрос возвращает более одной строки.Проблема, которую необходимо решить, - это если подзапрос, возвращающий несколько значений, является правильным, или если он должен когда-либо возвращать только одну строку.Оператор равенства для подзапроса ожидает, что будет возвращена только одна строка / запись.

Кроме того, MONTHS_BETWEEN возвращает месяцев между двумя датами.Если вы хотите увидеть количество дней, используйте b.activity - SYSDATE > 30 или наоборот, если это необходимо.

Если допустимо более одной строки -

Предложение IN

Естьнет необходимости во втором соединении в подзапросе к таблице VERSION:

UPDATE VERSION 
   SET isActive = 0
 WHERE customerNo IN (SELECT c.customerno
                        FROM Activity b 
                       WHERE b.VersionNo = VERSION.VersionNo
                         AND MONTHS_BETWEEN(SYSDATE, b.activity) > 30);

Псевдоним таблицы VERSION относится к обновляемой таблице.

Предложение EXISTS

UPDATE VERSION 
   SET isActive = 0
 WHERE EXISTS(SELECT NULL
                FROM ACTIVITY a
               WHERE VERSION.customerno = a.customerno
                 AND VERSION.versionno = a.versionno
                 AND MONTHS_BETWEEN(SYSDATE, b.activity) > 30);

Может быть только один?

Если должна быть возвращена только одна строка, может быть рассмотрена соответствующая агрегатная функция (MIN, MAX).

1 голос
/ 19 февраля 2011
MERGE INTO VERSION dest
USING (SELECT ver.VersionNo
FROM Activity act 
INNER JOIN VERSION ver ON act.VersionNo = var.VersionNo
WHERE (Months_between(sysdate, act.Activitye) > 30)) src
ON (scr.customerNo = dest.customerNo)
WHEN MATCHED THEN
UPDATE SET isActive = 0
1 голос
/ 19 февраля 2011

Заменить

WHERE customerNo = 

на

WHERE customerNo IN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...