【问题标题】:updating a table upon two conditions from the same table根据同一个表的两个条件更新表
【发布时间】:2013-01-21 08:03:56
【问题描述】:

我有一个表格,其中包含 bookstartyearendyearauthor 等列。

我需要根据以下情况同时更新startyearendyear 列,

STARTYEAR = ENDYEAR where STARTYEAR=0 and ENDYEAR != 0 
also
ENDYEAR = STARTYEAR  where ENDYEAR =0 and STARTYEAR != 0 

有可能

UPDATE Table SET STARTYEAR = ENDYEAR WHERE STARTYEAR=0 AND ENDYEAR<>0; 
UPDATE Table SET ENDYEAR = STARTYEAR  WHERE ENDYEAR =0 AND STARTYEAR<>0;

如何在一个查询中编写这两个查询?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:
    update table
    set 
    startYear = case when startyear = 0 and endyear<>0 then endyear else startYear end,
    endYear = case when endyear = 0 and startyear <> 0 then startyear else endYear end
    where startyear = 0 or endyear = 0;
    

    【讨论】:

    • 你可以让它们 bot = 0,因为当任何一个为 0 时,这是想要的结果
    • @Techmonk 不,您应该重新阅读问题,目标不是将这些值设置为 0。
    【解决方案2】:

    您可以使用或更新机器人字段,除非您在 startyear = endyear = 0 的情况下有触发器阻止您这样做;

    UPDATE Table SET STARTYEAR = STARTYEAR+ ENDYEAR, ENDYEAR = STARTYEAR+ENDYEAR WHERE STARTYEAR=0 OR ENDYEAR=0
    

    【讨论】:

    • +1,聪明而简单的想法。唯一的风险是空值:startYear = 0, endYear IS NULL 所以 0 + NULL = NULL,而不是 0。只需添加一个合并就可以了(如果它们可以为空)。
    【解决方案3】:

    您不能在一个语句中更新多个表,但是,您可以使用事务来确保将两个 UPDATE 语句视为一个。您还可以对它们进行批处理以避免往返。

    BEGIN TRANSACTION
    
    UPDATE Table SET STARTYEAR = ENDYEAR WHERE STARTYEAR=0 AND ENDYEAR<>0; 
    
    UPDATE Table SET ENDYEAR = STARTYEAR  WHERE ENDYEAR =0 AND STARTYEAR<>0;
    
    COMMIT
    

    但在您的情况下,您也可以使用this post 中的答案。

    【讨论】:

      【解决方案4】:

      这应该可行,

      update test
         set startyear = (case when startyear = 0 AND endyear <> 0 then endyear else startyear end),
             endyear   = (case when endyear = 0 AND startyear <> 0 then startyear else endyear end);
      

      【讨论】:

        【解决方案5】:

        另一种方法是:

        UPDATE Table 
        SET STARTYEAR = STARTYEAR + ENDYEAR
          , ENDYEAR   = STARTYEAR + ENDYEAR
        WHERE STARTYEAR = 0 AND ENDYEAR <> 0
           OR ENDYEAR = 0 AND STARTYEAR <> 0 ; 
        

        但我真的没有看到这样做的任何理由。您可以在事务中使用您拥有的 2 语句方式。它甚至可能比任何复杂的单一语句更有效。

        【讨论】:

          猜你喜欢
          • 2015-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-04
          • 2012-12-14
          • 1970-01-01
          相关资源
          最近更新 更多