T / SQL Puzzle - 如何连接以创建两个不相关的表的一对一关系?

时间:2009-05-08 16:03:54

标签: sql-server tsql join

我们假设我有两张桌子...... 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表基本上是一种为每人分配一片披萨的方法。该表存在,此解决方案将加载表的数据。

5 个答案:

答案 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