代码之家  ›  专栏  ›  技术社区  ›  user1093111

使用条件选择中的值更新行,否则插入新行

  •  0
  • user1093111  · 技术社区  · 6 年前

    我需要每天计算一个月。如果月份周期已经存在,我需要更新它,否则我需要为新月份创建新行。

    目前,我已经写了

    declare @period varchar(4) = '0218'
    DECLARE @Timestamp date = GetDate()
    
    IF EXISTS(select * from #output where period=@period)
      /* UPDATE #output SET  --- same calculation as below ---*/
    ELSE
       SELECT
        @period AS period,
        SUM(timecard.tworkdol) AS dol_local,
        SUM(timecard.tworkdol/currates.cdrate) AS dol_USD,
        SUM(timecard.tworkhrs) AS hrs,
        @Timestamp AS timestamp
    FROM dbo.timecard AS timecard
        INNER JOIN dbo.timekeep ON timecard.ttk = timekeep.tkinit
        INNER JOIN dbo.matter with (nolock) on timecard.tmatter = matter.mmatter
        LEFT JOIN dbo.currates with (nolock) on matter.mcurrency = currates.curcode 
            AND currates.trtype = 'A' 
            AND timecard.tworkdt BETWEEN currates.cddate1 
            AND currates.cddate2
    WHERE   timekeep.tkloc IN('06','07') AND
        timecard.twoper = @period
    
    SELECT * FROM #output;
    

    如何使用我的选择中的新数据简单地更新我的行。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Jorge Y.    6 年前

    不确定您使用的是什么RDBMS,但在SQL Server中,类似这样的内容会更新 #output 表中显示了 SELECT 您放置在 ELSE 零件:

    UPDATE o
        SET o.dol_local = SUM(timecard.tworkdol),
        SET o.dol_USD = SUM(timecard.tworkdol/currates.cdrate),
        SET o.hrs = SUM(timecard.tworkhrs),
        set o.timestamp = @Timestamp
    FROM #output o
    INNER JOIN dbo.timecard AS timecard ON o.period = timecard.twoper
    INNER JOIN dbo.timekeep ON timecard.ttk = timekeep.tkinit
    INNER JOIN dbo.matter with (nolock) on timecard.tmatter = matter.mmatter
    LEFT JOIN dbo.currates with (nolock) on matter.mcurrency = currates.curcode 
            AND currates.trtype = 'A' 
            AND timecard.tworkdt BETWEEN currates.cddate1 
            AND currates.cddate2
    WHERE   timekeep.tkloc IN('06','07') AND
        timecard.twoper = @period
    

    还有,我想你想做一个 INSERT 其他 部分,但你只是在做 选择 ,所以我想你也应该解决这个问题

        2
  •  0
  •   tysonwright    6 年前

    这一问题的答案因SQL方言而异,但有两种主要方法:
    1、Upsert(如果您的DBMS支持),例如在SQL Server中使用MERGE语句。
    2、SQL基于IF:

    IF NOT EXISTS (criteria for dupes)
     INSERT INTO (logic to insert)
    ELSE
     UPDATE (logic to update)