可以用其他方法代替我的光标



我正在处理一个分配,我必须在两个表中比较近500万行数据。表的结构相似,数据也相似(ID列匹配了99%,但我需要比较其余的列,即15列)

说例如,在表A中,零值由'n/a'呈现,但在表B中只是空。表A中的布尔列作为" true"one_answers" false",但" 0"one_answers" 1",表B。

我解决这个问题的方式是编写一个光标,该光标将在表A中进行编写数据,并使用"如果存在"

与表B进行比较

如果所有数据匹配,则我将该行插入一个称为"匹配"的表格,如果数据不匹配,则将其插入到名为" truncatched"'

的其他表格

我的光标目前仍在运行,现在已经快3个小时了。

想知道是否还有其他方法可以解决我的问题。

所以这里有两个表的样本

create table A (ID int, Name varchar(20), Address varchar(40), City varchar(20), 
State varchar(20), Country varchar(20))
create table B (ID int, Name varchar(20), Address varchar(40), City varchar(20), 
State varchar(20), Country varchar(20))
Insert into A values(1,'Daniel','12345 marion way', 'Sunnyvale', 'CA', 'USA'),
(2,'Chloe','38660 Hastings Street', 'Fremont', 'CA', 'USA'), 
(3,'Charles', '24980 willimet way', 'Hayward', 'CA', 'USA'),
(4,'Tommy', '98765 washington street', 'Fremont', 'CA', 'USA')
Insert into B values(1,'Daniel','12345 marion way', 'Santa Clara', 'CA', 'USA'),
(2,'Chloe',38660 Hastings Street', 'Fremont', 'CA', 'USA'), 
(3,'Charles', '24980 willimet way', 'Hayward', 'CA', 'USA')

因此,我为表A创建一个光标,然后尝试匹配表B,ID:1城市价值是错误的,ID:4中不存在于表B。

中。
Declare compare Cursor for 
    Select ID, Name, Address, City, State, Country from A
Open Compare
    Declare @ID int, @Name varchar(20), @Address varchar(50), @City varchar(20)
    ,@State varchar(20), @Country varchar(20)
Fetch next from compare into @ID, @Name, @Address, @City, @State, @Country
While @@Fetch_Status = 0
Begin
    Begin
    IF EXISTS (Select ID, Name, Address, City, State, Country from B
               where ID = @ID and Name = @Name and Address = @Address and
               City = @City and State = @State and Country = @country)
    Insert into Match values (@ID, @Name, @Address, @City, @State, @Country)
    Else
    Insert into Unmatched values(@ID, @Name, @Address, @City, @State, @Country)
    End
Fetch Next from compare into @ID, @Name, @Address, @City, @State, @Country
End
Close compare
deallocate compare 

为什么要在光标中逐行进行此行?为什么不只是执行批量插入?

INSERT INTO Match (ID, Name, Address, City, State, Country)
SELECT ID, Name, Address, City, State, Country
FROM A
WHERE Exists (
    SELECT 1 FROM B WHERE 
    A.ID = B.ID and A.Name = B.Name and A.Address = B.Address and
           A.City = B.City and A.State = B.State and A.Country = B.country
    )

INSERT INTO UnMatched (ID, Name, Address, City, State, Country)
SELECT ID, Name, Address, City, State, Country
FROM A
WHERE NOT EXISTS (
    SELECT 1 FROM B WHERE 
    A.ID = B.ID and A.Name = B.Name and A.Address = B.Address and
           A.City = B.City and A.State = B.State and A.Country = B.country
    )

您的匹配逻辑将需要完善,但是失去光标至少会让解决方案执行第一次迭代。如果可能的话,请确保索引字段。

相关内容

最新更新