2015-06-05 48 views
1

我有2个表。列出所有对象(对象)和包含对象(层次结构)层次结构的对象。从表中的同一列中获取多个值

Object table: 
ID | Description | ClassID 
------------------------------ 
0001 | Room 1A  | 1000 
0002 | Floor 1  | 1001 
0003 | Room 1B  | 1000 
0004 | Building 01 | 1002 

在哪里的classID指定的对象的类型(室= 1000,地板1001 =或建筑物= 1002)

Hierarchy table: 
RelationID | parentid | child ID | level 
1   | 0004  | 0002  | 1 
2   | 0004  | 0001  | 2 
3   | 0002  | 0001  | 1 

其中level指定子的分层等级。例如。如果我正在搜索所有建筑物(1 - >小孩(地板),2 - >孙子(房间))。

所以我想获取从对象表中的描述所有的房间,地板和建筑他们英寸

例如

Room | Floor | Bldg 
------------------- 
1A | 1 | 01 
1B | 1 | 01 
2A | 2 | 01 
2B | 2 | 01 
1A | 1 | 02 

等 我该如何去做这件事?

+0

“那么所有的建筑物(1 - >儿童(楼层),2 - >孙子(房间))”是否意味着您的'parentid'将始终是建筑物ID和子ID?基于级别的楼层ID或房间ID?你能发布表格中的实际数据吗? – ughai

+0

@ughai我在上面的表格中添加了一些示例数据 – AuthenticReplica

回答

0

您可以像这样多次加入ObjectTableHierarchyTable

SELECT B.Description, F.Description, R.Description 
FROM ObjectTable B 
    INNER JOIN HierarchyTable HT1 
     ON B.ID = HT1.parentid 
    INNER JOIN ObjectTable F 
     ON F.ID = HT1.childid 
    INNER JOIN HierarchyTable HT2 
     ON HT1.childid = HB2.parentid 
    INNER JOIN ObjectTable R 
     ON R.ID = HT2.childid 
WHERE B.ClassID = 1002 
    AND F.ClassID=1001 
    AND R.ClassID =1000 
    AND HT1.level = 1 
    AND HT2.level = 1 

编辑

只有Level = 1需要过滤。不需要从层次结构的孙子记录,我们遍历儿童对儿童

1

您可以使用这样的查询来获取数据:

SELECT Room.Description as Room, Floor.Description as Floor, Buildings.Description as Bldg 
FROM ObjectTable Buildings 
    INNER JOIN Hierarchy BuildingFloor ON Buildings.ID = BuildingFloor.ParentId AND BuildingFloor.level = 1 
    INNER JOIN ObjectTable Floor ON BuildingFloor.ChildId = Floor.ID 
    INNER JOIN Hierarchy FloorRoom ON Floor.ID = FloorRoom.ParentId AND FloorRoom.level = 2 
    INNER JOIN ObjectTable Room ON FloorRoom.ChildId = Room.ID 
WHERE Buildings.ClassID = 1002 AND Floors.ClassID=1001 AND Rooms.ClassID =1000 

我不完全了解在何处以及如何使用level场,所以这部分查询可能不需要

+0

有趣的是,你最初只使用'level'。基于模式和描述,我怀疑'level'和'ClassID'之一是多余的。很难肯定没有实际数据 – ughai

+1

@ughai如果没有多层次的层次结构,那么就没有必要提供'level'或'ClassID'限制,但很难准确无误地看到数据 – dotnetom

+0

我的意思是它看起来像'level'或'ClassID'类型意味着同样的事情。为什么他们都在模式中一起。 – ughai

相关问题