sql - 更新查询的问题

标签 sql oracle plsql

我有一个查询

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 
);

仅更新表 Table_1 中的 1000 行。

但如果我写
 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.

知道为什么会这样。请帮忙。

最佳答案

尼拉吉,

为每个表评估一个普通的子查询。为每一行评估相关子查询。并且您在第二个更新语句中创建了与行 Table_1.BUS_ID = ft.BUS_ID 相关的子查询。 .如果它对每一行进行评估,那么它将始终满足 ROWNUM <= 1000谓词。

问候,
抢。

关于sql - 更新查询的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7305330/

相关文章:

不会执行的 SQL 查询

sql - oracle中的CHECK约束,用于列之间的值检查

oracle - 在更新或删除 oracle 中 2 个表之间的 FK 约束后触发

plsql - 从PLSQL关联数组中选择?

c# - C#创建表并将行插入到SQL Server 2008中

sql - 计算两个日期之间的持续时间(将考虑月份和年份)

sql - 如何使用sql从两个表中选择行

java - AF :panelAccordion partialtrigger on af:selectOneChoice valueChangeListener

java.sql.SQLException : Fail to convert to internal representation Exception 异常

sql - 如何获取六个月内每个月的最小日期?