多连接问题

时间:2013-12-20 15:17:47

标签: sql-server database

*编辑**感谢您的所有输入,并抱歉迟到的回复。周末我没有上网。我从答案中意识到我需要提供更多信息,所以人们可以更全面地理解这个问题所以它来了:

我正在将旧的数据库设计迁移到新设计。旧的是一团糟,非常混乱(我没有参与旧的设计)。我附上了旧设计相关部分的图片:

a diagram http://i43.tinypic.com/e8k18y.png

名为Item的表也将存在于新设计中,并且它在新设计中获得了我需要的所有列,除了一个,它就是我的问题所在。我需要将名为'neededProp'的列与来自Item的每个新迁移行相关联(相关联,我的意思是新设计中新Item表中的列)。

因此,对于表环境中的特定eid,表Item中可以有 n 个条目。表格中存在“对应”集。知道Item和Room中关联哪些行的唯一方法是在相应表中的“itemId”和“objectId”列的帮助下。因此,例如对于特定的eid,Item和Room中可能有100个条目,它们的“itemId”和“objectId”可以是1到100之间的值,因此该列仅对于特定eid(或称为baseSeq)的特定eid是唯一的在表BaseFile中)。

基本上你可以说表Environment和BaseFile相互提醒,表Item和Room互相提醒。不同的是,有些表缺少一些列,而其他表可能有一些额外的。我不知道为什么它从一开始就是这样设计的。

我的问题是,如果有人可以帮我创建一个查询,这样我就可以找到Item-table中每一行的正确“neededProp”,这样我就可以将这些数据放到新设计中了?

* OLD-PART **这可能是一个微不足道的问题,但我无法按照我的意愿去工作。我想加入几个表,如下面的sql语句。如果我这样开始并运行此查询

select * from Environment e 
  join items ei on e.eid = ei.eid

我得到了400000行,这就是我想要的。但是,如果我再添加一行,那么它看起来像这样:

select * from Environment e 
  join items ei on e.eid= ei.eid
  left  join Room r on e.roomnr = r.roomobjectnr

我得到了疯狂的行数,因此必须进行一些乘法运算。我希望在加入第三个表后获得相同数量的行(在本例中为400000)。这有可能吗?也许就像创建前两行的临时视图一样。

我正在使用MSSQL服务器。

2 个答案:

答案 0 :(得分:1)

因此,如果不知道您在第二个查询中有哪些数据,就很难确切地说出如何编写这个数据,并且您可能遇到一个问题,即您在可能拥有的房间中添加了一个额外的列被遗忘的东西,例如指示设施或走廊的东西,或许您有多个“房间1”条目作为例子。

但是,为了回答你关于在没有使用临时表的情况下写出来的另一种方法的问题,我已经将下面的内容作为使用公共表表达式的示例,该表达式只返回每个源行一个记录。

;WITH cte_EnvironmentItems AS (
    SELECT *
    FROM Environment E
    INNER JOIN Items I ON I.eid = E.eid
), cte_RankedRoom AS (
    SELECT *
        ,ROW_NUMBER() OVER (ORDER BY R.UpdateDate DESC) [RN]
    FROM Room R
)

SELECT *
FROM cte_EnvironmentItems E
LEFT JOIN cte_RankedRoom R ON E.roomnr = R.roomobjectnr
    AND R.RN = 1

答案 1 :(得分:0)

顺便说一句,你想要从房间表中的列。如果没有那么

select * from Environment e 
  join items ei on e.eid= ei.eid
  where  e.roomnr in (select r.roomobjectnr from Room r )

否则

select * from Environment e 
  join items ei on e.eid= ei.eid
  left  join (select distinct roomobjectnr from Room) r on e.roomnr = r.roomobjectnr