我们假设我有两张桌子...... Foo和Bar。它们包含以下数据。
Table Foo:
Foo_Id
------
100
101
Table Bar:
Bar_Id
------
200
201
如您所见,每个表都有两条记录。我想以这样的方式将这些表格连在一起,以便返回两个记录;最终目标是为这些记录创建一对一的关系,即使在这种状态下他们没有这种关系。这些数据的结果将进入表Foo_Bar以存储这种新关系。
理想情况下,输出看起来类似于以下内容。
Foo_Id Bar_Id
------ ------
100 200
101 201
此代码将用于T / SQL存储过程。我可以使用while循环轻松编写这个,但我不想使用while循环,因为真实世界的应用程序将拥有比四个记录更多的数据,并且每天会多次调用多次。
提前致谢!
编辑:
这或多或少是一个库存问题......我有100片披萨和100个人说他们想要一块披萨。 Foo_Bar表基本上是一种为每人分配一片披萨的方法。该表存在,此解决方案将加载表的数据。
答案 0 :(得分:5)
试试这个:
declare @Foo table (Foo_Id int)
INSERT INTO @Foo VALUES (100)
INSERT INTO @Foo VALUES (101)
declare @Bar table (Bar_Id int)
INSERT INTO @Bar VALUES (200)
INSERT INTO @Bar VALUES (201)
SELECT
dt_f.Foo_Id
,dt_f.RowNumber
,dt_b.Bar_Id
FROM (SELECT
Foo_Id, ROW_NUMBER() OVER(ORDER BY Foo_Id) AS RowNumber
FROM @Foo
) dt_f
INNER JOIN (SELECT
Bar_Id, ROW_NUMBER() OVER(ORDER BY Bar_Id) AS RowNumber
FROM @Bar
) dt_b ON dt_f.RowNumber=dt_b.RowNumber
答案 1 :(得分:2)
选择foo_id,bar_id 来自foo_id =(bar_id -100)
的foo内部连接栏答案 2 :(得分:2)
从您给出的示例中,您可以利用bar_id = 100 + foo_id
这一事实select foo.foo_id, bar.bar_id from foo inner join bar on foo.foo_id +100 = bar.bar_id
..但也许这只是你的例子中的简化?
如果ID之间没有关联,那么它不再是关系数据,并且没有简单的方法来加入关系数据库中的行。
在这种情况下,您必须向其中一个表添加一个新列并添加一个外键,以便 数据成为关系。
答案 3 :(得分:2)
分配到库存通常是一次一行操作。使用集合很好,但它是一种“批处理”范例。我想设想各种各样的人从库存表中获取比萨饼。 Mssql对这个get-next-available-item模式有一些有用的提示 - 查看READPAST提示。要获得披萨,您可能会做类似
的事情UPDATE mytable WITH (READPAST) SET AcquiringUserID = @userId where AcquiringUserId is null
答案 4 :(得分:0)
从每个表中选择一个带有rank函数的嵌套select语句,然后加入等级。
select foo_id, bar_id
from (select foo_id, rank() over (partition by foo_id order by foo_id) as [Rank] from foo) f
left join (select bar_id, rank() over (partition by bar_id order by bar_id) as [Rank] from bar) b
on f.Rank = b.Rank