oracle 批量更新的情况下,但不同的id匹配特定的条件

gstyhher  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(138)

我有这个代码片段,我想根据TABLE_B中与条件匹配的单独行进行更新,然后每次匹配更新TABLE A中的字段。如果我进行单个更新,它工作正常。但是,如果第一条记录匹配,则会出现问题,它也会对第二个id执行相同的更新。我如何对一组与条件匹配的id进行不同的批量更新?:

UPDATE TABLE_A SET FOO
        = (CASE WHEN EXISTS (SELECT * FROM TABLE_B
           WHERE ID in (‘123’, ‘456’)
           AND (START_DATE <= TRUNC(SYSDATE) AND END_DATE >= TRUNC(SYSDATE)))
           THEN 'Y' ELSE 'N' END ),WHERE ID in (‘123’, ‘456’);

字符串
需要注意的一点是,我希望动态地传入一个随机数量的id(通过代码),这样就不会只有两个id,而是可以有更多的id。

snvhrwxg

snvhrwxg1#

您可以使用合并到来完成它。没有提供示例数据-我将创建一些只是作为示例:

CREATE TABLE
    TABLE_A (ID, FOO) AS
        (   Select '123' "ID", 'X' "FOO" From Dual Union All
        Select '456', 'X' From Dual Union All
        Select '789',  'X' From Dual 
        );
--  ID  FOO
--  --- ---
--  123 X
--  456 X
--  789 X
CREATE TABLE 
    TABLE_B AS
        (   Select '123' "ID",  To_Date('01.01.2023', 'dd.mm.yyyy') "START_DATE", To_Date('31.12.2023', 'dd.mm.yyyy') "END_DATE" From Dual Union All
            Select '456',  To_Date('01.01.2023', 'dd.mm.yyyy'), To_Date('30.06.2023', 'dd.mm.yyyy') From Dual Union All
            Select '789',  To_Date('01.01.2023', 'dd.mm.yyyy'), To_Date('31.12.2023', 'dd.mm.yyyy') From Dual 
        );
--  ID  START_DAT END_DATE 
--  --- --------- ---------
--  123 01-JAN-23 31-DEC-23
--  456 01-JAN-23 30-JUN-23
--  789 01-JAN-23 31-DEC-23

字符串
现在我们可以连接表并定义FOO列的值:

Select        a.ID "ID",  
            Case When b.ID Is Null Then 'N' Else 'Y' End "FOO"
From            TABLE_A a
Left Join   TABLE_B b ON(b.ID = a.ID And a.ID In('123', '456') And
            TRUNC(SYSDATE) Between b.START_DATE And b.END_DATE)
Where         a.ID In('123', '456')
--  ID  FOO
--  --- ---
--  123 Y
--  456 N


MERGE INTO可以使用上述查询来更新列FOO

Merge Into TABLE_A t
Using   (   Select        a.ID "ID", --b.START_DATE, b.END_DATE, 
                      Case When b.ID Is Null Then 'N' Else 'Y' End "FOO"
          From          TABLE_A a
          Left Join     TABLE_B b ON(b.ID = a.ID And a.ID In('123', '456') And
                      TRUNC(SYSDATE) Between b.START_DATE And b.END_DATE)
          Where           a.ID In('123', '456')
        ) x ON(x.ID = t.ID)
WHEN MATCHED THEN UPDATE SET t.FOO = x.FOO
Where t.ID In('123', '456')
--  2 rows merged.


你应该调整它以满足你的上下文。确保行是1到1连接的,以避免错误消息,并确保在表a中寻址正确的行。这可以在所使用的查询中或在ON条件中或在Where子句中完成,或者它们的任何组合,

--  R e s u l t :
Select * From TABLE_A
--  ID  FOO
--  --- ---
--  123 Y
--  456 N
--  789 X

相关问题