0

我有 2 个表“Order”和“OrderDetails”,其结构类似,如下所示。Order.id 是 OrderDetails 的外键

相同的结构存在于 3 个不同的区域数据库中。

现在

我们需要将 3 个区域表合并为一个。即(从2*3=6表到2表)

Order.id 可以在所有地区重复

例如:

region1DB.Order.id{1,2,3,4,5} , region2DB.order.id{1,2,3,4,5}

表结构

在此处输入图像描述

我需要 2 个表的最终输出,其中包含来自 3 个数据库的数据以及所有关系。

例如:如果第一个区域表有 10 个 orderid,则在合并来自第二个区域 order.id 的数据时,将以 11,12,13 开始/更新(其中第二个区域中的实际数字为 1,2,3,4)并在Orderdetails 它也应该被反映。

你能帮我查询一下这个合并吗?或任何其他可用的最新技术,如 sql 合并?如果是,请给我一个样品。

我是 sql 新手,我看不到合并关系表的完美示例。

这是我加入第一个表的查询

select  tab1.ID, tab1.OrderName
from [DB1].[dbo].[Order] tab1
union all
select tab2.id + (select max(id) from [DB1].[dbo].[Order]) ,tab2.OrderName
from [DB2].[dbo].[Order] tab2

-> 查询合并第二个表(OrderDetails)

declare @t varchar(8000)

set @t=(select max(id) from [DB1].[dbo].[Order]) 来自 [DB1].[dbo].[OrderDetails] tab1

select tab1.OrderID, tab1.productCode from [DB1].[dbo].[OrderDetails] tab1

union all

select

case when

tab2.OrderID> (@t) then tab2.OrderID + (@t)

when

tab2.OrderID<=(@t) then tab2.OrderID

END

,tab2.productCode

from [DB2].[dbo].[OrderDetails] tab2

order by OrderID

谢谢

国民账户体系

4

1 回答 1

0

我假设您使用的是 SQL Server 2008 并且能够实际使用 MERGE 命令。

在合并 MERGE 和 OUTPUT 语句之前,我已经使用了此链接中概述的方法。它对于执行基于集合的操作很有用,例如从一个源获取数据到目标,然后保留插入的标识值以供在从源链接子相关表时使用。

上述链接中使用的示例如下;

DECLARE @source TABLE (

   [id] INT PRIMARY KEY

,  [name] VARCHAR(10)

);

INSERT @source VALUES(1000,'Harold'),(2000,'Madge');

DECLARE @destination TABLE (

   [id] INT PRIMARY KEY IDENTITY(1,1)

,  NAME VARCHAR(10)

);



MERGE  @destination

USING  (SELECT [id], [name] FROM @source) AS [source]

ON     (1=0) --arbitrary join condition

WHEN   NOT MATCHED THEN

       INSERT (name)

       VALUES  (source.Name)

       OUTPUT  INSERTED.id AS NEWID,[source].[id] AS OldId,INSERTED.name; 

您可以看到,当您运行此示例时,您最终会得到 1000、2000 作为来自 @Source 的 Id,然后是 @Destination 中的新标识值 1 和 2 以及来自 @Source 的原始值。

然后,您可以将它与 OUTPUT INTO 结合起来,让您的 OldId 和 NewId 并排,从本质上重新映射新数据结构中的关系。由于时间紧迫,我现在无法深入研究,但您可以在诸如此类的 SO 答案或 MSDN 输出页面(参见示例部分)或各种其他站点上找到 SQL Server OUTPUT语句示例

您甚至可以像作者在上面的链接中所做的那样,通过简单地插入表变量或临时表来针对您的数据进行测试,以测试它是否适合您。

祝你好运。

于 2013-09-16T08:08:03.447 回答