同级记录在地图表中

时间:2014-05-02 18:28:42

标签: sql sql-server common-table-expression

我有一些数据库模式,我有两个表和一个映射表来定义我的两个表之间的关系。这些表是一个用户表(在本例中我称之为Sibling)和一个对象表,其中map表定义了用户与哪些对象相关。当然,我可以轻松地运行查询以按用户ID获取地图表的记录列表,但我还需要获取所有" sibling"可能与相同对象相关的其他用户的记录。我尝试使用公用表表达式来查询记录,但我遇到了无限循环问题。我甚至不确定CTE是否应该解决这个问题。我在这里设置了一个SQLFiddle示例。

http://sqlfiddle.com/#!6/289a4/6

因此,如果我查询兄弟ID为101,我希望得到以下记录集。

1 101

1 102

2 101

2 103

2 个答案:

答案 0 :(得分:1)

必需的输出:

declare @Sibling int 
set @Sibling = 101

;with Objects as 
(
      select ObjectId from ObjectSiblingMap 
      where SiblingId = @Sibling
)
,Siblings as 
(
      select ObjectId,SiblingId from ObjectSiblingMap
      where ObjectId in 
      (select ObjectId from Objects)
)
select * from Siblings

答案 1 :(得分:0)

您可以轻松检索映射到特定用户的对象:

SELECT ObjectId
FROM ObjectSiblingMap
WHERE SiblingId = 101

现在,为了获得与用户101相同的对象相关的用户,您应该使用基于先前结果的嵌套查询:

SELECT SiblingId
FROM ObjectSiblingMap
WHERE SiblingId <> 101
    AND ObjectId IN
    (SELECT ObjectId
    FROM ObjectSiblingMap
    WHERE SiblingId = 101)