在目标记录之前选择已排序的记录

时间:2016-09-26 22:20:06

标签: sql sql-server

这个问题的背景是我们不得不在第三方Oracle数据库和我们的SQL Server数据库之间进行手动滚动复制,因为Oracle表中没有定义主键,但是 独特的索引。

在大多数情况下,以下方法可以正常工作:我们在Oracle和SQL Server数据库中的每个对应表中加载唯一索引中列的值以及所有列值的MD5哈希值,然后能够计算出什么需要插入/删除/更新记录。

但是,在一个表中,绝对行数使我们无法将所有记录从Oracle和SQL Server数据库加载到内存中。所以我们需要在块中进行比较。

我正在考虑的方法是:从Oracle表中查询第一个 n 记录,然后 - 使用相同的排序顺序 - 查询SQL Server表所有记录,直到从Oracle数据库返回的最后一条记录,然后比较两个数据集,以确定需要插入/删除/更新的内容。

然后,一旦完成从Oracle数据库加载下一个 n 记录并查询SQL Server表中的记录,当以相同方式排序时在(并包括)该数据集中的第一个和最后一个记录之间。

我的问题是:如何在SQL Server中实现这一点?如果我有 第n 记录的值(在Oracle中以某种排序顺序查询表),我该如何返回记录范围,包括记录使用SQL Server中的那些值?

示例

我有下表:

| Id                                                  | SOU_ORDREF | SOU_LINESEQ | SOU_DATOVER             | SOU_TIMEOVER     | SOU_SEQ | SOU_DESC               |
|-----------------------------------------------------|------------|-------------|-------------------------|------------------|---------|------------------------|
| AQ000001_10_25/07/2004 00:00:00_14_1                | AQ000001   | 10          | 2004-07-2500:00:00.000  | 14               | 1       | Black 2.5mm Cable      |
| AQ000004_91_26/07/2004 00:00:00_15.4833333333333_64 | AQ000004   | 91          | 2004-07-26 00:00:00.000 | 15.4333333333333 | 63      | 2.5mm Yellow Cable     |
| AQ000005_31_26/07/2004 00:00:00_10.8333333333333_18 | AQ000005   | 31          | 2004-07-26 00:00:00.000 | 10.8333333333333 | 18      | Rotary Cam Switch      |
| AQ000012_50_26/07/2004 00:00:00_11.3_17             | AQ000012   | 50          | 2004-07-26 00:00:00.000 | 11.3             | 17      | 3Mtr Heavy Gauge Cable |

Id字段基本上是组成表上唯一索引的五个字段的串联,即SOU_ORDREF,SOU_LINESEQ,SOU_DATOVER,SOU_TIMEOVER和SOU_SEQ。

我想要做的是能够查询,例如,所有记录(按这些列排序)到Id' AQ000005_31_26 / 07/2004 00:00:00_10的记录.8333333333333_18'这将给我们以下结果(我只会显示ID):

| Id                                                  |
|-----------------------------------------------------|
| AQ000001_10_25/07/2004 00:00:00_14_1                |
| AQ000004_91_26/07/2004 00:00:00_15.4833333333333_64 |
| AQ000005_31_26/07/2004 00:00:00_10.8333333333333_18 |

因此,该查询未包含Id' AQ000012_50_26 / 07/2004 00:00:00_11.3_17'因为它来自AQ000005_31_26 / 07/2004 00:00:00_10.8333333333333_18'当我们按SOU_ORDREF,SOU_LINESEQ,SOU_DATOVER,SOU_TIMEOVER和SOU_SEQ订购时。

0 个答案:

没有答案
相关问题