我有两个表,其中表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)
答案 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不按名称匹配列,而是按顺序位置匹配。