【问题标题】:Insert records into a table with IF statement from a temp in SQL Server 2016使用 SQL Server 2016 中临时的 IF 语句将记录插入表中
【发布时间】:2018-03-30 13:41:52
【问题描述】:

我有一个表 table1 有一些列,必须根据某些条件计算并移动到另一个表 table2。为了满足这些条件,我创建了一个临时表 #ttemp 并将临时表更改为创建两个新变量 var1var2 以根据不同的列设置一些值,然后检查这些条件。如果条件通过,我会进行一些聚合,然后我会插入到 table2 中,这将具有聚合列。

首先,从table1 创建#temp 表和变量。

SELECT * 
INTO #ttemp
FROM table1

alter table #ttemp add var1 int
alter table #ttemp add var2 int

update #ttemp set var1 = -1

update #ttemp set var1 = 1
where error <> 0 and var1 = -1

update #ttemp var2 = -1

接下来,#temp 表(var1 = 0var2 = -1)中 var1 列和 var2 列的值并计算 cus_requestcus_stay 的平均值并将它们放入新的温度表#ttemp2

IF var2 = -1 and var1 = 0
   BEGIN
   select y.id, y.avg(cus_request) as r_avg, y.avg(cust_stay) as s_avg
   INTO #ttemp2
   FROM #ttemp as y

   UPDATE l
   SET l.cus_request_avg = t.r_avg, l.cust_stay_avg = t.s_avg
   FROM table2 as l
   inner join #ttemp2 as t
   t.id = l.id

END

我的问题是,我的 IF 语句不起作用,如果我只运行 select 语句和 update 语句,它工作正常,但在更新语句之后,我得到 0 rows affected,因为条件不满足。我使用update 而不是insert 语句。如何将记录插入table2

任何帮助将不胜感激。

【问题讨论】:

  • 你的 BEGIN 在哪里?
  • 你能发布完整的查询吗?我并没有真正了解您的 IF 是如何适应的。使用 IF 您想要比较一个值,而不是列。你在那里所做的可以通过我想象的 WHERE 子句来实现。
  • @Leonidas199x 我正在比较来自var1var2 列的值。我是 SQL Server 的新手。你的意思是我可以在where子句中设置var1var2的值比较?
  • 你的伪代码太模糊了,很难弄清楚你想在这里完成什么。
  • @SeanLange 好的,让我编辑帖子。是否可以执行 IF 语句并插入记录?抱歉,我正在尝试理解 SQL 的 IF ELSE 逻辑!

标签: sql sql-server if-statement aggregation insert-update


【解决方案1】:

我认为你在滥用 IF。

IF 将比较两个值,而不是查看两列并挑选出满足条件的数据。

我认为您可以使用 WHERE 子句实现您所追求的目标:

   SELECT avg(y.cus_request) AS r_avg, avg(y.cust_stay) AS s_avg
   INTO #ttemp2 as t2
   FROM #ttemp as y
   WHERE    y.var2 = -1 AND y.var1 = 0

   UPDATE l
   SET l.cus_request_avg = t.r_avg, 
       l.cust_stay_avg = t.s_avg
   FROM table2 as l
   inner join #ttemp2 as t ON t.id = l.id

回答cmets中的问题....

要插入到表中,它是:

INSERT INTO table2 
        (
            cus_request_avg ,
            cust_stay_avg
        )
SELECT      t.r_avg         ,
            t.s_avg
FROM        #ttemp2     AS t;

只在table2中不存在记录的地方插入:

INSERT INTO table2 
        (
            cus_request_avg ,
            cust_stay_avg
        )
SELECT      t.r_avg         ,
            t.s_avg
FROM        #ttemp2     AS t
LEFT JOIN   table2      AS l ON t.id = l.id
WHERE       l.id IS NULL;

【讨论】:

  • 我正在从上面的 cmets 编辑我的问题,但我可以用文字进行编辑,而不是在我的代码中进行编辑,就像我所拥有的那样。让我试试这个。这可能是要走的路!
  • @i.n.n.m 做了一些修改,别名需要注意。
  • 是的,我的错误 - 道歉。你将#ttemp2 加入到table2 的什么位置?
  • where 子句有效,但是,如果我必须在计算平均值后立即插入实时,我该如何在table2 中使用插入?而不是使用更新? (假设我在 table2 中没有任何数据)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多