【问题标题】:PL/SQL: I have problem updating a table with data from another tablePL/SQL:我在用另一个表中的数据更新表时遇到问题
【发布时间】:2021-11-27 04:10:44
【问题描述】:

第一桌ROOMDB

roomnumber rentalbalance
N327 0

第二桌RENTALINVOICE

invoicedate roomnumber totaldue
11/26/2021 N327 2,200.00

我的更新代码:

UPDATE ROOMDB
SET 
RENTALBALANCE = (SELECT TOTALDUE
                   FROM RENTALINVOICE
                  WHERE RENTALINVOICE.ROOMNUMBER=ROOMDB.ROOMNUMBER
                    AND INVOICEDATE=SYSDATE) ;

我需要用来自RENTALINVOICE 的数据更新ROOMDB 中的totaldue 列,尽管它成功地将2,200 输入到totaldue 列,同时它还清除了该列的其余记录在ROOMDB

每次我更新它时,它都会删除除我指定的roomnumber 之外的其余记录。请帮忙。

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    您似乎还更新了表roomdb 中的行,其中表rentalinvoice 中没有行,因此rentalbalance 列将设置为null。

    看看下面的例子:

    drop table a;
    create table a (id number, cost number);
    insert into a values (1, 1);
    insert into a values (2, 2);
    
    drop table b;
    create table b (id number, cost number);
    insert into b values (1, 100);
    
    -- updates all rows in a and sets cost to null whenen there is no row in b
    update a set cost = (select cost from b where a.id = b.id);
    select * from a;
    
    -- only updaes rows in a where there is a row in b
    update a set cost = id;
    update a set cost = (select cost from b where a.id = b.id) where exists (select 1 from b where a.id = b.id);
    select * from a;
    

    【讨论】:

    • 感谢 doberkofler,这样更好吗? UPDATE ROOMDB SET RENTALBALANCE = (SELECT TOTALDUE FROM RENTALINVOICE WHERE INVOICEDATE=SYSDATE AND ROOMNUMBER=ROOMDB.ROOMNUMBER) WHERE EXISTS (SELECT 1 FROM RENTALINVOICE WHERE INVOICEDATE=SYSDATE AND ROOMNUMBER=ROOMDB.ROOMNUMBER) ;
    • 看起来更好,但在您的update 中使用sysdate 可能会出现问题。我宁愿使用WHERE EXISTS (SELECT 1 FROM RENTALINVOICE WHERE INVOICEDATE=ROOMDB. INVOICEDATE AND ROOMNUMBER=ROOMDB.ROOMNUMBER) ;,并且在使用 sysdate 时必须小心,因为它还包含时间,所以您通常只将日期的日期部分与 trunc(sysdate) 之类的内容进行比较。
    【解决方案2】:

    当您执行这样的更新命令时,Oracle 将更新所有表行。对于每一行,选择命令将使用这些行值执行。如果更新中select的结果没有找到任何记录将返回null。在这种情况下,RENTALBALANCE 列也会设置为 null。

    (SELECT TOTALDUE
              FROM RENTALINVOICE
             where WHERE RENTALINVOICE.ROOMNUMBER = ROOMDB.ROOMNUMBER
                     AND INVOICEDATE = SYSDATE)
    

    【讨论】:

    • 你好像不知道怎么用markdown
    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多