проблема с запросом на обновление - PullRequest
4 голосов
/ 05 сентября 2011

У меня запрос

UPDATE Table_1 SET Col1='Y' WHERE ROWID IN (
    select ROWID from (
        SELECT BUS_ID,
               row_number() over (partition by BUS_ID order by BUS_ID) dupe_count,
               rowid
        from Table_1
        WHERE col2 <> 1
          AND col3 <> 1
        order by dbms_random.value 
    ) ft
    where ft.dupe_count = 1
      AND ROWNUM <= 1000 
);

обновляет только 1000 строк в таблице Table_1.

Но если я пишу

 UPDATE Table_1 SET Col1='Y' WHERE ROWID IN (
     select ROWID from (
         SELECT BUS_ID,
                row_number() over (partition by BUS_ID order by BUS_ID) dupe_count,
                rowid
         from Table_1
         WHERE col2 <> 1
           AND col3 <> 1
         order by dbms_random.value 
     ) ft
     where ft.dupe_count = 1
       and Table_1.BUS_ID = ft.BUS_ID
       AND ROWNUM <= 1000 
);

, обновляются все строки таблицы.независимо от RoWNUM <= 1000, т.е. если я добавлю

Table_1.BUS_ID = ft.BUS_ID

, то он обновит все строки, которые удовлетворяют col2<> 1 AND col3<> 1 and ft.dupe_count=1.Таблица имеет следующую структуру:

BUS_ID | col1 | col2 | col3
     1 |      |   0  | 0
     2 |      |   0  | 0
     1 |      |   0  | 0
     3 |      |   1  | 1.

Любая идея, почему это происходит. Пожалуйста, помогите.

1 Ответ

4 голосов
/ 05 сентября 2011

Niraj,

Обычный подзапрос оценивается для каждой таблицы.Коррелированный подзапрос оценивается для каждой строки.И вы сделали подзапрос во втором операторе обновления со строкой Table_1.BUS_ID = ft.BUS_ID.И если он оценивает каждую строку, то он всегда будет удовлетворять предикату ROWNUM <= 1000.

С уважением,
Роб.

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