【问题标题】:Get Data from 5 tables从 5 个表中获取数据
【发布时间】:2017-01-18 20:58:57
【问题描述】:

我有 5 个表格包含城市信息(Unite 包含(但不总是)子单元 - 子单元包含(但不总是)建筑物 - 并且建筑物包含(但不总是)房间

1-Unites:包括列:

标识(PK)

联合名称

....

2- 子单元:包括列:

ID (PK)

名字

UniteId(FK for ID in Unites table Table)- 注意(不是所有的单元都包含子单元) ....

3- 建筑:包括列:

ID (PK)

名字

SubUniteId(SubUnites 表中 ID 的 FK)- 注意(并非所有联合子单元都包含建筑物) ...

4- 房间:包括列:

ID (PK)

名字

BuildingId(建筑物表中 ID 的 FK)- 注意(并非所有建筑物都包含房间) ....

5- 订单:包括列:

身份证

AreaId(可能是(Unite 表中的 ID 列)或(SubUnites 表中的 ID 列)或(Building 表中的 ID 列)或(Rooms 表中的 ID 列)

我可以通过 ID 为其中任何一个下订单

问题: 我如何进行 sql 选择查询以获取任何具有完整信息的订单.. 这意味着如果我获得特定房间的订单,我需要知道在哪个建筑物和哪个子单元以及哪个单元 如果我收到特定建筑物的订单,我需要知道在哪个子单元中以及在哪个单元中等等 - 无需重复数据

我尝试了很多查询,但都不起作用

任何帮助

【问题讨论】:

  • 您只是在寻找JOIN 关键字吗?你尝试了什么?
  • 搜索Join,正如这里大多数其他人指出的那样。我想你需要一个Left Outer Join

标签: sql asp.net sql-server database


【解决方案1】:

所以看起来您正在尝试创建一个表 [Orders],该表将通过 [AreaId] 列链接/关联到可能的 4 个其他表。

问题是您没有提供任何一列来指定与每个特定订单记录相关的表。

将 [Orders] 表拆分为 4 个单独的 Orders 表,每个表都有一个订单或提供一种方式,即 [UniteOrders]、[SubUniteOrders] 等。使每个订单成为一个单元对多个订单的关系

如果你想要所有订单,你可以做一个联合查询从所有表中提取

另一种选择是使用 GUID 作为 ID,然后您可以将它们存储在 [AreaId] 中,并确保在很大程度上不会有重复。

关于 GUID 类型的 SQL Server 文档:

https://msdn.microsoft.com/en-us/library/ms187942.aspx

【讨论】:

    【解决方案2】:

    在无法访问数据的情况下试一试。请让我知道这是否是您要完成的任务。

    Select 
      U.ID
    , U.NAME
    , U.UniteName
    , O_FROM_U.*
    , SU.ID
    , SU.NAME
    , SU.UniteID
    , O_FROM_SU.*
    , B.ID
    , B.Name
    , B.SubUniteID
    , O_FROM_B.*
    , R.ID
    , R.Name
    , R.BuildingID
    , O_FROM_R.*
    
    FROM
    Unites U
    LEFT OUTER JOIN SubUnites SU        ON SU.UNITEID = U.ID
    LEFT OUTER JOIN Building B          ON B.SubUniteID = SU.ID
    LEFT OUTER JOIN Rooms R             ON R.BuildingID = B.ID
    
    LEFT OUTER JOIN ORDERS O_FROM_U     ON U.ID = O_FROM_U.AreaID
    LEFT OUTER JOIN ORDERS O_FROM_SU    ON SU.ID = O_FROM_SU.AreaID
    LEFT OUTER JOIN ORDERS O_FROM_B     ON B.ID = O_FROM_B.AreaID
    LEFT OUTER JOIN ORDERS O_FROM_R     ON R.ID = O_FROM_R.AreaID
    

    【讨论】:

      【解决方案3】:
      SELECT A.ID as unitid,A.Unitname as unitname,B.id as subuniteid,B.Name as subunitname,c.ID as buildingid,C.Name as buildingname,D.id as roomid,D.name as roomname,e.id as orderid,e.areaid
      from
      UniT A JOIN Subunit B
      on A.Id=B.UnitId
      Join Building c
      on B.ID=C.Subunitid
      Join Room D
      ON C.ID=D.buildingid
      Join Orders E 
      on E.Id=A.Id
      

      【讨论】:

        猜你喜欢
        • 2016-11-13
        • 2015-03-28
        • 1970-01-01
        • 1970-01-01
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-23
        相关资源
        最近更新 更多