在insert语句中重用计算列

时间:2014-09-29 15:58:41

标签: sql tsql sql-server-2012

我需要在表格中插入4列,其中第四列是第二列和第三列的总和。 所需输出的逻辑等效如下,但它在语法上不正确。 重点是MISCPRICE的计算很复杂,我想用这个结果来找到总数。

INSERT INTO TABLE1 (ID, BASEPRICE, MISCPRICE, TOTAL)
SELECT TABLE2.ID, TABLE2.BASEPRICE,
       (SELECT (SELECT SUM(PRICE) FROM TABLE3 WHERE TABLE2.ID = TABLE3.ID)
               + TABLE4.TAX + TABLE4.MISC
        FROM TABLE4
        WHERE TABLE4.ID = TABLE2.ID), ?????
FROM TABLE2
WHERE TABLE2.ID NOT IN             
    (SELECT TABLE1.ID
     FROM TABLE1)

--ONLY INSERTING WHEN THE ID IS NOT ALREADY PRESENT IN THE TABLE

所以要找到总数,我可以做类似下面的事情,但这意味着重复MISCPRICE的整个计算,这是一个性能开销,而且看起来也很混乱。

TABLE2.BASEPRICE
    +
(SELECT (SELECT SUM(PRICE) FROM TABLE3 WHERE TABLE2.ID = TABLE3.ID)
          + TABLE4.TAX + TABLE4.MISC
 FROM TABLE4
 WHERE TABLE4.ID = TABLE2.ID)

我尝试使用(BASEPRICE + MISCPRICE)总计,但它说

  

无效的列名“BASEPRICE”

有没有办法重复使用计算列MISPRICE来查找插入时的总数?

我确实使用临时表解决了这个问题并使用变量计算行。但我希望尽可能避免这种情况。

1 个答案:

答案 0 :(得分:3)

尝试将其包装在另一个选择中虽然我同意@GordonLinoff在评论中认为理想的解决方案不是以这种方式存储价值。对于您的数据库系统,确切的systax可能略有不同。

INSERT INTO TABLE1 VALUES(ID, BASEPRICE, MISCPRICE, TOTAL)
 SELECT ID, BASEPRICE, MISCPRICE, BASEPRICE + MISCPRICE FROM (
  SELECT TABLE2.ID, TABLE2.BASEPRICE,
   (SELECT (SELECT SUM(PRICE) FROM TABLE3 WHERE TABLE2.ID = TABLE3.ID)
           + TABLE4.TAX + TABLE4.MISC
    FROM TABLE4
    WHERE TABLE4.ID = TABLE2.ID) AS MISCPRICE
 FROM TABLE2 WHERE TABLE2.ID NOT IN             
 (SELECT TABLE1.ID
  FROM TABLE1.ID)) TEMP_VIEW