不存在时进行SQL插入更新目标表中是否存在多行记录

时间:2019-01-31 15:21:28

标签: sql sql-server

我有两个表,其中表A必须更新或在现有表的基础上插入行。我通过使用JOINS EXCEPT和MERGE语句尝试了此操作,但是我有一个我无法解决的问题。所以这是一个例子:

表A(归因表)

attr   | attrValue | prodID
--------------------------
  4    |   2       |   1
-------------------------- 
  3    |   10      |   2
--------------------------
  1    |   7       |   2
--------------------------
  3    |   10      |   3
--------------------------
  6    |   9       |   3
--------------------------
  1    |   4       |   3
--------------------------

表P(产品表)

prodID | stock   |
------------------
  1    |  1
------------------
  2    |  0
------------------
  3    |  1
------------------
  4    |  1
------------------

现在我想在SQL中执行以下操作:

所有库存> 0的产品应在表A中具有attr = 6和attrValue = 9的条目

所有库存<1的产品应在表A中具有attr = 6和attrValue = 8的条目。

我需要执行SQL查询,因为我的问题是表A中的prodID有多个条目

这就是我在想的:

首先检查表A中是否存在prodID(表B中的任何条目),如果不存在,则将prodID插入表A(attr = 6,attrValue = 8/9(取决于库存))

如果表A中的prodID已经存在attr = 6的条目,则更新此行并将attrValue设置为8/9(取决于库存)

所以我正在寻找“我的想法”到sqlQuery的翻译

感谢您的帮助。

(使用:用于管理的SQL SERVER Express 2012和HEIDI SQL)

1 个答案:

答案 0 :(得分:2)

由于您的“ attr 6”行可以从P表的状态导出100%,因此将行冗余存储在A中是个糟糕的主意。

这更好:

(1)将第一个视图ATTR6_FOR_P定义为SELECT prodID,将6定义为attr,将CASE(...)定义为来自P的attrValue。CASE表达式根据P中的库存值选择值8或9。

(2)将第二个视图A_EXT定义为UNION ATTR6_FOR_P。 (***)

现在库存变化将始终立即反映在A_EXT中,而无需明确更新。

(***),但要注意列顺序,因为SQL UNION不按名称匹配列,而是按顺序位置匹配。