我有一个table_A,我从.csv文件导入数据。我想将table_A中的一些列与table_B进行比较,并相应地将数据插入表中并将状态更新为table_A。 我应该使用什么while循环或光标.. Plz做建议
DECLARE @A_2 VARCHAR(10), @A_3 VARCHAR(50), @A_4 VARCHAR(100)
DECLARE db_cursor CURSOR FOR
SELECT A_2, A_3, A_4 FROM Temp_table
OPEN db_cursor
FETCH NEXT FROM db_cursor
INTO @A_2, @A_3, @A_4
WHILE @@FETCH_STATUS = 0
BEGIN
If @A_2 <> (SELECT C_2 FROM Table_C where C_2= @A_2)
UPDATE Temp_table SET [Status]='Not Exits in Table_C'
ELSE BEGIN
IF @A_3=(Select B_3 from Table_B where B_3=@A_3) AND @A_2=(SELECT B_2 FROM Table_B where B_2= @A_2)
UPDATE Temp_table SET [Status]='Duplicate Row, Already Exists'
ELSE
IF (@A_4 <>'B_4 '+'B_5')
UPDATE Temp_table SET [Status]=' Format is not accepted '
ELSE
INSERT INTO Table_B(B_2, B_3, B_4) VALUES(@A_2, @A_3, @A_4)
END
CLOSE db_cursor DEALLOCATE db_cursor
FETCH NEXT FROM db_cursor INTO @A_2, @A_3, @A_4
END
此处Temp_table是我将从.csv文件导入数据的表,并且将使用Table_B,Table_C和Temp_Table的列进行比较 这是正确的做法吗?
答案 0 :(得分:0)
我对性能不太熟悉,但我不推荐使用while循环,因为它会非常慢。我会做类似的事情:
subprocess.Popen('hh.exe "C:\WINDOWS\ULIX TxT Editor\Resources\helpCenter\helpCentre11.chm"')
这只是一般指南,我希望它可以帮助您入门。否则你必须更加具体。
更新和比较的参考资料:
答案 1 :(得分:0)
都不是。如果您正在使用SQL,那么第一步是从程序上思考并转向基于集合的思考。
要执行您要执行的操作,请使用MERGE
。 https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql
<强> SETUP 强>
IF OBJECT_ID('tempdb..#table_A') IS NOT NULL
DROP TABLE #table_A
CREATE TABLE #table_A (col1 int, col2 int, colX int, checkme bit DEFAULT 0) ;
INSERT INTO #table_A (col1, col2, colX)
VALUES
(1,1,1)
, (2,2,2)
, (3,3,3)
, (4,4,4)
;
IF OBJECT_ID('tempdb..#table_B') IS NOT NULL
DROP TABLE #table_B
CREATE TABLE #table_B (col1 int, col2 int, colX int) ;
INSERT INTO #table_B (col1, col2, colX)
VALUES
(0,0,1)
, (0,0,2)
;
<强> BEFORE 强>
SELECT * FROM #table_A ;
SELECT * FROM #table_B ;
QUERY TIME
MERGE #table_B AS target
USING ( SELECT col1, col2, colX FROM #table_A ) AS source (col1, col2, colX)
ON (target.colX = source.colX)
WHEN MATCHED THEN
UPDATE SET col1 = source.col1
, col2 = source.col2
WHEN NOT MATCHED THEN
INSERT (col1, col2)
VALUES (source.col1, source.col2)
;
<强> AFTER 强>
SELECT * FROM #table_A ;
SELECT * FROM #table_B ;
我想你也可以使用MERGE
更新#table_A
中的标志,但我不知道正确的语法。如果需要,您还可以在UPDATE
后运行另一个MERGE
。
MARK TABLE_A FLAG
UPDATE #table_A
SET flag = 1
FROM #table_B
WHERE #table_A.col1 = #table_B.col1
AND #table_A.col2 = #table_B.col1
AND #table_B.colX IS NOT NULL
;
之后 SELECT * FROM #table_A;
MORE MERGE
GOODIES: http://www.made2mentor.com/2012/07/got-the-urge-to-merge/
答案 2 :(得分:-1)
如果您想提高性能,那么您需要查看基于SET的操作。虽然循环和游标基本相同。
有关详细信息,请参阅以下链接
http://www.techrepublic.com/blog/the-enterprise-cloud/comparing-cursor-vs-while-loop-performance-in-sql-server-2008/