我必须比较表1和表2.但结果应该只给出表1的记录,其中表2中有任何数据变化。表示结果应小于或等于500.
我没有任何主键但是2个表中的列是相同的。我写了以下查询。但我得到超时异常并且需要花费很多时间来处理。请帮忙。
With CTE_DUPLICATE(OLD_FIRSTNAME ,New_FirstName,
OLD_LASTNAME ,New_LastName,
OLD_MINAME ,New_MIName ,
OLD_FAMILYID,NEW_FAMILYID,ROWNUMBER)
as (
Select distinct
OLD.FIRST_NAME AS 'OLD_FIRSTNAME' ,New.First_Name AS 'NEW_FIRSTNAME',
OLD.LAST_NAME AS 'OLD_LASTNAME',New.Last_Name AS 'NEW_LASTNAME',
OLD.MI_NAME AS 'OLD_MINAME',New.MI_Name AS 'NEW_MINAME',
OLD.FAMILY_ID AS 'OLD_FAMILYID',NEW.FAMILY_ID AS 'NEW_FAMILYID',
row_number()over(partition by OLD.FIRST_NAME ,New.First_Name,
OLD.LAST_NAME ,New.Last_Name,
OLD.MI_NAME ,New.MI_Name ,
OLD.FAMILY_ID,NEW.FAMILY_ID
order by OLD.FIRST_NAME ,New.First_Name,
OLD.LAST_NAME ,New.Last_Name,
OLD.MI_NAME ,New.MI_Name ,
OLD.FAMILY_ID,NEW.FAMILY_ID )as rank
From EEMSCDBStatic OLD,EEMS_VIPFILE New where
OLD.MPID <> New.MPID and old.FIRST_NAME <> New.First_Name
and OLD.LAST_NAME <> New.Last_Name and OLD.MI_NAME <> New.MI_Name
and old.Family_Id<>New.Family_id
)
sELECT OLD_FIRSTNAME ,New_FirstName,
OLD_LASTNAME ,New_LastName,
OLD_MINAME ,New_MIName ,
OLD_FAMILYID,NEW_FAMILYID FROM CTE_DUPLICATE where rownumber=1
答案 0 :(得分:0)
我认为这里的主要问题是您的查询强制数据库完全乘以您的表,这意味着处理~500M组合。之所以发生这种情况,是因为您将来自T1的任何记录与T2中具有至少一个不同值的任何记录连接起来,其中MPID
看起来像是必须用于连接记录的唯一标识符。
如果MPID
确实是标识两个表中记录的列,那么您的查询应该有一个不同的结构:
SELECT old.FIRSTNAME, new.FirstName,
old.LASTNAME, new.LastName,
old.MINAME, new.MIName,
old.FAMILYID, new.FAMILYID
FROM EEMSCDBStatic old
INNER JOIN EEMS_VIPFILE new ON old.MPID = new.MPID
WHERE old.FIRST_NAME <> New.First_Name
AND OLD.LAST_NAME <> New.Last_Name
AND OLD.MI_NAME <> New.MI_Name
AND old.Family_Id <> New.Family_id
ORDER BY old.FIRSTNAME, new.FirstName,
old.LASTNAME, new.LastName,
old.MINAME, new.MIName,
old.FAMILYID, new.FAMILYID
其他一些想法:
如果您要在记录中查找任何更改(即使只有一列具有不同的值),您应该在{{OR
中使用WHERE
1}}子句,而不是AND
s。现在,您只需查找更改所有列中的值的记录。例如,您未能找到更改其姓名但决定保留姓氏的人。
您应该考虑将表格编入索引。
答案 1 :(得分:0)
将DISTINCT
关键字与ROWNUMBER
一起使用毫无意义。
请参阅此sql query distinct with Row_Number。
你正在做CROSS JOIN,这在你的情况下是非常大的。
也许在那种情况下你
where OLD.MPID <> New.MPID and old.FIRST_NAME <> New.First_Name and ...
你想要OR而不是AND?
为什么你根本使用ROWNUMBER
也许并不完全清楚 - 也许是为了找到最佳匹配。
所有这一切都是因为正如@Shnugo正确评论的那样,你的比较背后的逻辑是错误的 - 你必须有一些逻辑定义来加入表格(比如第一和第二名必须相同)。