我有两个这样的表:
表格1
DataS DataH DataO
001 101 ABA
003 101 ABC
001 101 AAB
001 105 BBA
002 102 ABB
002 102 ACA
表2
DataS DataH DataO Result1 Result2 Result3
003 101 ABC
001 105 BBA
我正在尝试使用两个输入参数创建一个过程:@DataS
, @DataH
. 应该做什么程序:
- 从 Table1 中选择所有记录
WHERE DataS=@DataS AND DataH=@DataH
。 - 对于每个选定的行,检查表 2 中是否存在具有相同三个值的 IF 记录
[DataS]
[DataH]
[DataO]
。 - 如果是 - 更新 Table2 中的这一行(SET Result1 = (MyFunction)、SET Result2 = (MyFunction) 等)
- 如果否 - 使用所有参数插入此行 [DataS] [DataH] [DataO] [Result1] [Result2] [Result3]
所以 Table2 在执行过程后应该是这样的:
表2(更新后)
DataS DataH DataO Result1 Result2 Result3
003 101 ABC 1.5 1.3 1.4
001 105 BBA 1.6 1.1 1.3
001 101 ABA 1.6 1.3 1.4
001 101 AAB 1.6 1.3 1.4
002 102 ABB 1.1 1.4 1.4
002 102 ACA 1.3 1.4 1.1
是否可以在一个程序中完成?最好的方法是什么(保持良好的效率)?是否可以使用 cte 来完成,或者是否有更好的解决方案,一些循环功能?
DECLARE @ID int
SELECT @ID = (SELECT ID FROM Table2 WHERE DataS=@DataS AND DataH=@DataH AND DataO=@DataO)
IF EXISTS @ID
BEGIN
--UPDATE Table2 SET Result1=... WHERE ID=@ID
END
ELSE
BEGIN
--INSERT INTO Table2 (.....)
END
更新:我认为最好的解决方案是使用 MERGE,正如 Luis Cazares 所说(谢谢),所以我做了新的程序,比如:
MERGE Table2 AS ex
USING x AS st
ON (x.DataS = st.DataSAND ex.DataO = st.DataO AND ex.DataH = st.DataH)
WHEN MATCHED THEN UPDATE SET ex.Result1 = 9
WHEN NOT MATCHED THEN
INSERT(DataS,DataH,DataO,Result1)
VALUES(st.DataS,st.DataH,st.DataO,9);
看起来很聪明,但它不起作用,而且我认为 MERGE 在我使用的旧 2005 SQL Server 上不支持(从 2008 年开始)。所以我尝试了 mkRabbani 提议的 CURSOR 函数,它可以工作(谢谢)。