2017-08-25 19 views
1

我有一個table_A從哪裏我從.csv文件導入數據。我想比較table_A中的一些列與table_B,並相應地將數據插入到表中並將狀態更新爲table_A。 我應該用什麼While循環或光標.. PLZ確實表明遊標或while循環什麼將是一個很好的選擇,以處理6,00,000+行數據

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 [email protected]_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文件,比較導入數據的表將使用表-B,Table_C的列完成與Temp_Table 它會是正確的方法嗎?

+5

大思維轉變與關係型數據庫是擺脫程序思維了 - 一會兒,curosrs - 並進入思考套。 SQL在比較大量數據和處理數據方面非常出色。擁抱SQL! – n8wrl

+7

也不要使用基於集合的查詢。 – RBarryYoung

+0

位開放式,其他選項可用,取決於您可以使用直接查詢的性能(無需循環或遊標,基於集合的方法會更好),或者如果數據使用SSIS作爲更多線性思維的選項set太大/ perf是一個問題 – Andrew

回答

0

我對性能不太熟悉,但我不會推薦一個while循環,因爲它會很慢。我會做類似的事情:

UPDATE table1 
SET table1.column1 = table2.column1, 
    table1.column2 = table2.column2 
WHERE (do a select statement or column comparison) 

這只是一個通用指南,我希望它能幫助您入門。否則,你將不得不變得更具體。

參考更新和比較:

How do I UPDATE from a SELECT in SQL Server?

Microsoft UPDATE

-1

如果你想提高性能,那麼你需要看看基於SET操作。而循環和光標基本上是相同的東西。

參考更多詳細信息

http://www.techrepublic.com/blog/the-enterprise-cloud/comparing-cursor-vs-while-loop-performance-in-sql-server-2008/ 
0

無論下面的鏈接。如果你正在使用SQL,第一步就是從程序化的思維轉向走向集思維。

要做你想要做的事情,請使用MERGEhttps://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) 
; 

SELECT * FROM #table_A ;  
SELECT * FROM #table_B ; 

查詢時間

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) 
; 

SELECT * FROM #table_A ;  
SELECT * FROM #table_B ; 

認爲你也可以使用MERGE#table_A更新標誌,但我不知道正確的語法。如果需要,也可以在MERGE之後運行另一個UPDATE

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 
; 

AFTER AFTER SELECT * FROM #table_A;

更多MERGE超值服務:http://www.made2mentor.com/2012/07/got-the-urge-to-merge/

相關問題