我有两个这样的表:
表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
。应该执行什么程序:
WHERE DataS=@DataS AND DataH=@DataH
中选择所有记录。[DataS]
[DataH]
[DataO]
的IF记录。因此在执行过程之后,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
更新: 我认为最好的解决方案是使用Luis Cazares所说的MERGE(谢谢),所以我做了新的程序,例如:
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);
看起来很聪明,但是它不起作用,因此我觉得我使用的旧版2005 SQL Server(从2008开始)不支持MERGE。因此,我尝试使用mkRabbani建议的CURSOR函数,该函数可以正常工作(谢谢)。
答案 0 :(得分:0)
这可以使用下面定义的CURSOR来实现。测试值应替换为函数输出。
DECLARE @DataS VARCHAR(50)
DECLARE @DataH VARCHAR(50)
SET @DataS = '003'
SET @DataH = '101'
DECLARE @DataS_T1 VARCHAR(50)
DECLARE @DataH_T1 VARCHAR(50)
DECLARE @DataO_T1 VARCHAR(50)
DECLARE @DataS_T2 VARCHAR(50)
DECLARE @DataH_T2 VARCHAR(50)
DECLARE @DataO_T2 VARCHAR(50)
DECLARE db_cursor CURSOR
FOR
SELECT
T1.DataH DataH_T1,T1.DataO DataO_T1,T1.DataS DataS_T1,
T2.DataH DataH_T2,T2.DataO DataO_T2,T2.DataS DataS_T2
FROM Table1 T1
LEFT JOIN Table2 T2
ON T1.DataH = T2.DataH AND T1.DataO =T2.DataO AND T1.DataS = T2.DataS
WHERE T1.DataH = @DataH
AND T1.DataS = @DataS
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @DataH_T1,@DataO_T1,@DataS_T1,@DataH_T2,@DataO_T2,@DataS_T2
WHILE @@FETCH_STATUS = 0
BEGIN
IF (@DataH_T2 IS NULL)
BEGIN
INSERT INTO Table2 (DataS,DataH,DataO,Result1,Result2,Result3)
VALUES (@DataS_T1,@DataH_T1,@DataO_T1,'Test Result 1','Test Result 2','Test Result 3')
END
ELSE
BEGIN
UPDATE Table2
SET Result1 = 'Test',
Result2= 'test2',
Result3= 'Test3'
WHERE DataS = @DataS_T2
AND DataH = @DataH_T2
AND DataO = @DataO_T2
END
FETCH NEXT FROM db_cursor INTO @DataH_T1,@DataO_T1,@DataS_T1,@DataH_T2,@DataO_T2,@DataS_T2
END
CLOSE db_cursor
DEALLOCATE db_cursor