【问题标题】:Using the returned select rows while updating a table在更新表时使用返回的选择行
【发布时间】:2017-08-02 18:11:38
【问题描述】:

我必须根据条件更新选定的行。 以下查询返回几行:

select
        b.CRDATTIM,
        b.RECORDCD,
        b.CRNODE,
        b.UNITCD,
        b.WRKTYPE


    from W67U999S a
    join W03U999S b
        on a.CCRDATTIM = b.CRDATTIM and a.CRECORDCD = b.RECORDCD and a.CCRNODE = b.CRNODE
    where a.PCRDATTIM = '2017-07-20-04.22.20.893340'
    and a.PRECORDCD = 'F'
    and a.PCRNODE = '01'
    and b.WRKTYPE = 'CALLER'
    and b.UNITCD='CS2XAA';

现在我必须根据以下where 条件更新上述select 查询中已经使用的W67u999s 表的pcrdattim

W67u999s.ccrdattim=returned select row.crdattim

我已尝试使用以下查询,但它不起作用。:

update W67u999s set pcrdattim='2017-07-31-07.40.42.355440' from W67U999S as a inner join W03U999S as b on a.CCRDATTIM = b.CRDATTIM and a.CRECORDCD = b.RECORDCD and a.CCRNODE = b.CRNODE
    where a.PCRDATTIM = '2017-07-20-04.22.20.893340'
    and a.PRECORDCD = 'F'
    and a.PCRNODE = '01'
    and b.WRKTYPE = 'CALLER'
    and b.UNITCD='CS2XAA'
    and a.ccrdattim=crdattim and b.crecordcd='T';

有什么想法吗?

【问题讨论】:

  • 能否在 select 语句上创建一个视图并在更新中使用它?或者只是使用:从(内部 SQL)集合 更新表,然后是连接条件。
  • I 事物视图会使查询进一步复杂化。我们不能不使用任何视图吗?我的意思是使用joins

标签: sql oracle


【解决方案1】:

MERGE 在这种情况下是你的朋友。 MERGE 允许您只使用 JOIN(就像您已经拥有的一样)并将其用作桌子上 UPDATE 的基础。

MERGE 需要从 USING 子句到要更新的表的连接。在大多数用例中,使用主键就可以了。由于您没有提供完整的表结构,请查看此示例并根据您的需要对其进行调整。

merge into W67U999S t 
using (

    select
        a.primary_key, b.CRDATTIM -- change this line

        /*
            b.CRDATTIM,
            b.RECORDCD,
            b.CRNODE,
            b.UNITCD,
            b.WRKTYPE
        */

        from W67U999S a
        join W03U999S b
            on a.CCRDATTIM = b.CRDATTIM and a.CRECORDCD = b.RECORDCD and a.CCRNODE = b.CRNODE
        where a.PCRDATTIM = '2017-07-20-04.22.20.893340'
        and a.PRECORDCD = 'F'
        and a.PCRNODE = '01'
        and b.WRKTYPE = 'CALLER'
        and b.UNITCD='CS2XAA'
) u
on (t.primary_key = u.primary_key)
when matched then update set t.pcrdattim = u.CRDATTIM

【讨论】:

  • 有用的解决方案 +1
【解决方案2】:

以下查询对我有用(exists 在这里发挥了作用):

update W67U999S a set pcrdattim= '2017-07-31-07.40.42.355440'
where exists 
(select
        b.CRDATTIM,
        b.RECORDCD,
        b.CRNODE,
        b.UNITCD,
        b.WRKTYPE
    from W03U999S b

    where a.PCRDATTIM = '2017-07-20-04.22.20.893340'
  and  a.CCRDATTIM = b.CRDATTIM 
  and a.CRECORDCD = b.RECORDCD 
  and a.CCRNODE = b.CRNODE
    and a.PRECORDCD = 'F'
    and a.PCRNODE = '01'
    and b.WRKTYPE = 'CALLER'
    and b.UNITCD='CS2XAA' and a.crecordcd='T');

【讨论】:

    【解决方案3】:

    这可能会有所帮助:

    update W67U999S from 
    (
        select
                b.CRDATTIM,
                b.RECORDCD,
                b.CRNODE,
                b.UNITCD,
                b.WRKTYPE
    
    
            from W67U999S a
            join W03U999S b
                on a.CCRDATTIM = b.CRDATTIM and a.CRECORDCD = b.RECORDCD and a.CCRNODE = b.CRNODE
            where a.PCRDATTIM = '2017-07-20-04.22.20.893340'
            and a.PRECORDCD = 'F'
            and a.PCRNODE = '01'
            and b.WRKTYPE = 'CALLER'
            and b.UNITCD='CS2XAA'
    ) X
    set  W67u999s.ccrdattim= X.crdattim
    where
        W67U999S.CCRDATTIM = X.CRDATTIM 
        and W67U999S.CRECORDCD = X.RECORDCD 
        and W67U999S.CCRNODE = X.CRNODE
    

    【讨论】:

    • Oracle 不支持这种语法。不过,您可能可以使用MERGE 实现类似的效果。
    猜你喜欢
    • 2013-09-30
    • 2017-02-17
    • 1970-01-01
    • 2019-02-15
    • 2019-03-21
    • 2021-05-06
    • 2020-01-21
    • 2021-08-01
    • 1970-01-01
    相关资源
    最近更新 更多