2015-06-05 49 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

相關問題