我有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)并且在Orderdeatils中也应该反映出来。
你能帮我查一下这个合并吗? 或者像sql merge这样的任何其他最新技术?如果是,请给我一个样品。
我是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
由于
SNA
答案 0 :(得分:0)
我假设您正在使用SQL Server 2008并且能够实际使用MERGE命令。
在结合MERGE和OUTPUT语句之前,我使用了this link中概述的方法。它对于执行基于集合的操作非常有用,例如将数据从一个源获取到目标,然后保留插入的标识值,以便在链接源中与子项相关的表时使用。
上述使用链接的例子如下:
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的Ids,然后是@Destination中的新身份值1和2以及来自@Source的原始值。
然后,您可以将其与OUTPUT INTO结合使用,以使您的OldId和NewId并排,从而基本上重新映射新数据结构中的关系。由于时间紧迫,我无法深入研究这个问题,但您可以在this或MSDN Output page或者{{3}}等各种答案中找到SQL Server OUTPUT语句的示例(参见示例部分)或各种其他网站。
您甚至可以通过简单地插入表变量或临时表来对照您的数据进行测试,就像作者在上面的链接中所做的那样,以测试它是否适合您。
祝你好运。