pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

如何使用根 ID 在 SQL Server 中的父子表中檢索葉路

How to retrieve leaf path in parent-child table in SQL Server with root ID?(如何使用根 ID 在 SQL Server 中的父子表中檢索葉路徑?)
本文介紹了如何使用根 ID 在 SQL Server 中的父子表中檢索葉路徑?的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

我處理在SQL Server中存儲(chǔ)Tree的類型,它有一個(gè)特定的方法.在這個(gè)方法中,我們有兩個(gè)這樣的表:

位置表

LocationID |評(píng)論-----------+--------1 德黑蘭2 阿扎迪街3 號(hào) 5


LocationParent 表

LocationParentID |家長(zhǎng) ID |兒童ID |深度-----------------+----------+---------+------1 1 1 02 1 2 13 1 3 24 2 2 15 2 3 26 3 3 2

我希望有這樣的結(jié)果:

LocationID |地址-----------+--------------------------------3 德黑蘭 >阿扎迪圣 >5號(hào)

ParentIDChildID 中將存儲(chǔ)LocatioID.我想知道如何通過一個(gè)查詢檢索根到子路徑.如果我們有:City >街 >胡同 >數(shù)字 6.每一個(gè)都有一個(gè)單獨(dú)的locationID,例如city在位置表中有一行,依此類推.

現(xiàn)在我會(huì)有整個(gè)地址的列表?

有什么簡(jiǎn)單的解決辦法嗎??

解決方案

我不完全了解您的需求,我懷疑您提供的結(jié)構(gòu)是否是最好的方法.查看以下 遞歸 CTE 示例.您可以放置??過濾器以僅獲取所需的行:

DECLARE @LocType TABLE(LocTypeID INT,LocType VARCHAR(100));INSERT INTO @LocType VALUES(1,'Country'),(2,'縣'),(3,'城市'),(4,'街道'),(5,'房子');聲明@mockup TABLE(LocationID INT,ParentID INT,LocTypeId INT,Value VARCHAR(250));插入@mockup 值(1,NULL,1,'美國(guó)'),(2,1,3,'紐約'),(3,2,4,'路1'),(4,2,4,'路2'),(5,2,4,'3號(hào)公路'),(6,4,5,'路2中的房子1'),(7,4,5,'Rouad 2 的 House 2'),(8,NULL,1,'德國(guó)'),(9,8,3,'柏林'),(10,9,4,'廣場(chǎng)1'),(11,9,4,'廣場(chǎng) 2'),(13,10,5,'Platz 1 的房子');使用recCTE AS(SELECT m.LocationID,m.ParentID,m.LocTypeID,m.Value,1 AS Lvl,CAST(m.Value AS NVARCHAR(MAX)) AS LocPath來自@mockup AS m其中 m.ParentID 為空聯(lián)合所有選擇 m.LocationID,m.ParentID,m.LocTypeID,m.Value,r.Lvl + 1,r.LocPath + ' >' + CAST(m.Value AS NVARCHAR(MAX))來自@mockup AS mINNER JOIN recCTE AS r ON m.ParentID=r.LocationID)選擇 * 從 recCTE;

結(jié)果

+------------+---------+-----------+--------------------+-----+-----------------------------------------------+|位置 ID |家長(zhǎng) ID |位置類型 ID |價(jià)值 |等級(jí) |位置路徑 |+------------+------------+------------+-------------------+-----+-----------------------------------------------+|1 |空 |1 |美國(guó) |1 |美國(guó) |+------------+------------+------------+-------------------+-----+-----------------------------------------------+|8 |空 |1 |德國(guó) |1 |德國(guó) |+------------+------------+------------+-------------------+-----+-----------------------------------------------+|9 |8 |3 |柏林 |2 |德國(guó) >柏林 |+------------+------------+------------+-------------------+-----+-----------------------------------------------+|10 |9 |4 |廣場(chǎng) 1 |3 |德國(guó) >柏林 >廣場(chǎng) 1 |+------------+------------+------------+-------------------+-----+-----------------------------------------------+|11 |9 |4 |廣場(chǎng) 2 |3 |德國(guó) >柏林 >廣場(chǎng) 2 |+------------+------------+------------+-------------------+-----+-----------------------------------------------+|13 |10 |5 |房子在 Platz 1 |4 |德國(guó) >柏林 >廣場(chǎng) 1 >房子在 Platz 1 |+------------+------------+------------+-------------------+-----+-----------------------------------------------+|2 |1 |3 |紐約 |2 |美國(guó)>紐約 |+------------+------------+------------+-------------------+-----+-----------------------------------------------+|3 |2 |4 |路1 |3 |美國(guó)>紐約 >路1 |+------------+------------+------------+-------------------+-----+-----------------------------------------------+|4 |2 |4 |路2 |3 |美國(guó)>紐約 >路2 |+------------+------------+------------+-------------------+-----+-----------------------------------------------+|5 |2 |4 |路3 |3 |美國(guó)>紐約 >路3 |+------------+------------+------------+-------------------+-----+-----------------------------------------------+|6 |4 |5 |2號(hào)路1號(hào)樓|4 |美國(guó) >紐約 >路 2 >2號(hào)路1號(hào)樓|+------------+------------+------------+-------------------+-----+-----------------------------------------------+|7 |4 |5 |位于 Rouad 2 的 House 2 |4 |美國(guó)>紐約 >路 2 >位于 Rouad 2 的 House 2 |+------------+------------+------------+-------------------+-----+-----------------------------------------------+

您存儲(chǔ)的LocationID(例如作為一個(gè)人的address)是最詳細(xì)的部分(葉節(jié)點(diǎn))

您可以輕松地將此邏輯轉(zhuǎn)換為自下而上(從葉子開始)
您可以通過查找所有條目來找到葉子,其中 LocationID 未作為 ParentID 找到.

更新我為你改變了...

更新 2 添加深度

檢查這個(gè)

WITH recCTE AS(SELECT m.LocationID AS LeafID,m.LocTypeId,m.LocationID,m.ParentID,m.Value,CAST(m.Value AS NVARCHAR(MAX)) AS LocPath,1 AS 深度來自@mockup AS m哪里不存在(從@mockup AS x WHERE x.ParentID=m.LocationID 中選擇 1)聯(lián)合所有選擇 r.LeafID,r.LocTypeId,m.LocationID,m.ParentID,m.Value,CAST(m.Value AS NVARCHAR(MAX)) + ' >' + r.LocPath,r.深度+1來自@mockup AS mINNER JOIN recCTE AS r ON m.LocationID=r.ParentID)SELECT LeafID,LocTypeId,LocPath,Depth從 recCTE哪里 ParentID 為空;

結(jié)果

+--------+-----------+-----------------------------------------------+-------+|葉 ID |位置類型 ID |位置路徑 |深度 |+--------+-----------+-----------------------------------------------+-------+|13 |5 |德國(guó) >柏林 >廣場(chǎng) 1 >房子在 Platz 1 |4 |+--------+-----------+-----------------------------------------------+-------+|11 |4 |德國(guó) >柏林 >廣場(chǎng) 2 |3 |+--------+-----------+-----------------------------------------------+-------+|7 |5 |美國(guó)>紐約 >路 2 >位于 Rouad 2 的 House 2 |4 |+--------+-----------+-----------------------------------------------+-------+|6 |5 |美國(guó)>紐約 >路 2 >2號(hào)路1號(hào)樓|4 |+--------+-----------+-----------------------------------------------+-------+|5 |4 |美國(guó)>紐約 >路3 |3 |+--------+-----------+-----------------------------------------------+-------+|3 |4 |美國(guó)>紐約 >路1 |3 |+--------+-----------+-----------------------------------------------+-------+

I cope with type of storing Tree in SQL Server which has a specific method. In this method we have two table like this:

Location Table

LocationID | Remark  
-----------+--------
    1        Tehran
    2        Azadi St
    3        Number5


LocationParent Table

LocationParentID | ParentID | ChildID | Depth 
-----------------+----------+---------+------
      1               1          1       0
      2               1          2       1
      3               1          3       2
      4               2          2       1
      5               2          3       2
      6               3          3       2

I desire have result like this:

LocationID |            Address
-----------+--------------------------------
      3        Tehran >   Azadi St > Number5

In ParentID and ChildID will store LocatioID. I wonder how can I retrieve root to child path with one query. I should say these tables maintain adresses for exmaple if we have : City > Street > Alley > Number 6. Each of these has a separated locationID for instance city has one row in Location Table and so on.

Now I would have list of whole adresses?

Is there any simple solution??

解決方案

I do not fully understand your needs and I doubt, that the structure you provide is the best approach. Have a look at the following example of a recursive CTE. You can place a filter to get only the needed row:

DECLARE @LocType TABLE(LocTypeID INT,LocType VARCHAR(100));
INSERT INTO @LocType VALUES(1,'Country')
                          ,(2,'County')
                          ,(3,'City')
                          ,(4,'Street')
                          ,(5,'House');
DECLARE @mockup TABLE(LocationID INT,ParentID INT,LocTypeId INT,Value VARCHAR(250));
INSERT INTO @mockup VALUES
 (1,NULL,1,'USA')
,(2,1,3,'New York')
,(3,2,4,'Road 1')
,(4,2,4,'Road 2')
,(5,2,4,'Road 3')
,(6,4,5,'House 1 in Road 2')
,(7,4,5,'House 2 in Rouad 2')

,(8,NULL,1,'Germany')
,(9,8,3,'Berlin')
,(10,9,4,'Platz 1')
,(11,9,4,'Platz 2')
,(13,10,5,'House in Platz 1');

WITH recCTE AS
(
    SELECT m.LocationID,m.ParentID,m.LocTypeID,m.Value,1 AS Lvl,CAST(m.Value AS NVARCHAR(MAX)) AS LocPath
    FROM @mockup AS m
    WHERE m.ParentID IS NULL

    UNION ALL

    SELECT m.LocationID,m.ParentID,m.LocTypeID,m.Value
          ,r.Lvl + 1
          ,r.LocPath + ' > ' + CAST(m.Value AS NVARCHAR(MAX))
    FROM @mockup AS m
    INNER JOIN recCTE AS r ON m.ParentID=r.LocationID
)
SELECT * FROM recCTE;

The result

+------------+----------+-----------+--------------------+-----+-----------------------------------------------+
| LocationID | ParentID | LocTypeID | Value              | Lvl | LocPath                                       |
+------------+----------+-----------+--------------------+-----+-----------------------------------------------+
| 1          | NULL     | 1         | USA                | 1   | USA                                           |
+------------+----------+-----------+--------------------+-----+-----------------------------------------------+
| 8          | NULL     | 1         | Germany            | 1   | Germany                                       |
+------------+----------+-----------+--------------------+-----+-----------------------------------------------+
| 9          | 8        | 3         | Berlin             | 2   | Germany > Berlin                              |
+------------+----------+-----------+--------------------+-----+-----------------------------------------------+
| 10         | 9        | 4         | Platz 1            | 3   | Germany > Berlin > Platz 1                    |
+------------+----------+-----------+--------------------+-----+-----------------------------------------------+
| 11         | 9        | 4         | Platz 2            | 3   | Germany > Berlin > Platz 2                    |
+------------+----------+-----------+--------------------+-----+-----------------------------------------------+
| 13         | 10       | 5         | House in Platz 1   | 4   | Germany > Berlin > Platz 1 > House in Platz 1 |
+------------+----------+-----------+--------------------+-----+-----------------------------------------------+
| 2          | 1        | 3         | New York           | 2   | USA > New York                                |
+------------+----------+-----------+--------------------+-----+-----------------------------------------------+
| 3          | 2        | 4         | Road 1             | 3   | USA > New York > Road 1                       |
+------------+----------+-----------+--------------------+-----+-----------------------------------------------+
| 4          | 2        | 4         | Road 2             | 3   | USA > New York > Road 2                       |
+------------+----------+-----------+--------------------+-----+-----------------------------------------------+
| 5          | 2        | 4         | Road 3             | 3   | USA > New York > Road 3                       |
+------------+----------+-----------+--------------------+-----+-----------------------------------------------+
| 6          | 4        | 5         | House 1 in Road 2  | 4   | USA > New York > Road 2 > House 1 in Road 2   |
+------------+----------+-----------+--------------------+-----+-----------------------------------------------+
| 7          | 4        | 5         | House 2 in Rouad 2 | 4   | USA > New York > Road 2 > House 2 in Rouad 2  |
+------------+----------+-----------+--------------------+-----+-----------------------------------------------+

The LocationID you store (e.g. as the address of a person) is the most detailled part (the leaf-node)

You can easily turn this logic to bottom-up (start off with the leafs)
You find a leaf by looking for all entries, which LocationID is not found as a ParentID.

UPDATE I turned it around for you...

UPDATE 2 Added Depth

Check this

WITH recCTE AS
(
    SELECT m.LocationID AS LeafID,m.LocTypeId
          ,m.LocationID,m.ParentID,m.Value
          ,CAST(m.Value AS NVARCHAR(MAX)) AS LocPath
          ,1 AS Depth
    FROM @mockup AS m
    WHERE NOT EXISTS(SELECT 1 FROM @mockup AS x WHERE x.ParentID=m.LocationID)

    UNION ALL

    SELECT r.LeafID,r.LocTypeId 
          ,m.LocationID,m.ParentID,m.Value
          ,CAST(m.Value AS NVARCHAR(MAX)) + ' > ' + r.LocPath
          ,r.Depth +1
    FROM @mockup AS m
    INNER JOIN recCTE AS r ON m.LocationID=r.ParentID
)
SELECT LeafID,LocTypeId,LocPath,Depth
FROM recCTE
WHERE ParentID IS NULL;

The result

+--------+-----------+-----------------------------------------------+-------+
| LeafID | LocTypeId | LocPath                                       | Depth |
+--------+-----------+-----------------------------------------------+-------+
| 13     | 5         | Germany > Berlin > Platz 1 > House in Platz 1 | 4     |
+--------+-----------+-----------------------------------------------+-------+
| 11     | 4         | Germany > Berlin > Platz 2                    | 3     |
+--------+-----------+-----------------------------------------------+-------+
| 7      | 5         | USA > New York > Road 2 > House 2 in Rouad 2  | 4     |
+--------+-----------+-----------------------------------------------+-------+
| 6      | 5         | USA > New York > Road 2 > House 1 in Road 2   | 4     |
+--------+-----------+-----------------------------------------------+-------+
| 5      | 4         | USA > New York > Road 3                       | 3     |
+--------+-----------+-----------------------------------------------+-------+
| 3      | 4         | USA > New York > Road 1                       | 3     |
+--------+-----------+-----------------------------------------------+-------+

這篇關(guān)于如何使用根 ID 在 SQL Server 中的父子表中檢索葉路徑?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

Converting Every Child Tags in to a Single Column with multiple Delimiters -SQL Server (3)(將每個(gè)子標(biāo)記轉(zhuǎn)換為具有多個(gè)分隔符的單列-SQL Server (3))
How can I create a view from more than one table?(如何從多個(gè)表創(chuàng)建視圖?)
Create calculated value based on calculated value inside previous row(根據(jù)前一行內(nèi)的計(jì)算值創(chuàng)建計(jì)算值)
How do I stack the first two columns of a table into a single column, but also pair third column with the first column only?(如何將表格的前兩列堆疊成一列,但也僅將第三列與第一列配對(duì)?) - IT屋-程序員軟件開發(fā)技
Recursive t-sql query(遞歸 t-sql 查詢)
Convert Month Name to Date / Month Number (Combinations of Questions amp; Answers)(將月份名稱轉(zhuǎn)換為日期/月份編號(hào)(問題和答案的組合))
主站蜘蛛池模板: 单机除尘器 骨架-脉冲除尘器设备生产厂家-润天环保设备 | 精密模具制造,注塑加工,吹塑和吹瓶加工,EPS泡沫包装生产 - 济南兴田塑胶有限公司 | 精密光学实验平台-红外粉末压片机模具-天津博君 | 南京交通事故律师-专打交通事故的南京律师 | 耐酸泵,耐酸泵厂家-淄博华舜耐腐蚀真空泵 | 无锡市珂妮日用化妆品有限公司|珂妮日化官网|洗手液厂家 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 工业雾炮机_超细雾炮_远程抑尘射雾器-世纪润德环保设备 | 希望影视-高清影视vip热播电影电视剧免费在线抢先看 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 青岛空压机,青岛空压机维修/保养,青岛空压机销售/出租公司,青岛空压机厂家电话 | 「阿尔法设计官网」工业设计_产品设计_产品外观设计 深圳工业设计公司 | 滑板场地施工_极限运动场地设计_滑板公园建造_盐城天人极限运动场地建设有限公司 | 塑钢件_塑钢门窗配件_塑钢配件厂家-文安县启泰金属制品有限公司 深圳南财多媒体有限公司介绍 | 小青瓦丨古建筑瓦丨青瓦厂家-宜兴市徽派古典建筑材料有限公司 | PVC地板|PVC塑胶地板|PVC地板厂家|地板胶|防静电地板-无锡腾方装饰材料有限公司-咨询热线:4008-798-128 | 不锈钢监控杆_监控立杆厂家-廊坊耀星光电科技有限公司 | 科研ELISA试剂盒,酶联免疫检测试剂盒,昆虫_植物ELISA酶免试剂盒-上海仁捷生物科技有限公司 | 铸钢件厂家-铸钢齿轮-减速机厂家-淄博凯振机械有限公司 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | 广州企亚 - 数码直喷、白墨印花、源头厂家、透气无手感方案服务商! | SEO网站优化,关键词排名优化,苏州网站推广-江苏森歌网络 | 五轴加工中心_数控加工中心_铝型材加工中心-罗威斯 | 澳洁干洗店加盟-洗衣店干洗连锁「澳洁干洗免费一对一贴心服务」 干洗加盟网-洗衣店品牌排行-干洗设备价格-干洗连锁加盟指南 | 带压开孔_带压堵漏_带压封堵-菏泽金升管道工程有限公司 | 光栅尺厂家_数显表维修-苏州泽升精密机械 | 上海办公室装修,写字楼装修—启鸣装饰设计工程有限公司 | 耐力板-PC阳光板-PC板-PC耐力板 - 嘉兴赢创实业有限公司 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 无轨电动平车_轨道平车_蓄电池电动平车★尽在新乡百特智能转运设备有限公司 | 河南生物显微镜,全自动冰冻切片机-河南荣程联合科技有限公司 | 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 水质传感器_水质监测站_雨量监测站_水文监测站-山东水境传感科技有限公司 | 选矿设备,选矿生产线,选矿工艺,选矿技术-昆明昆重矿山机械 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | 山东活动策划|济南活动公司|济南公关活动策划-济南锐嘉广告有限公司 | 搅拌磨|搅拌球磨机|循环磨|循环球磨机-无锡市少宏粉体科技有限公司 | 政府园区专业委托招商平台_助力企业选址项目快速落地_东方龙商务集团 | 一点车讯-汽车网站,每天一点最新车讯! | 承插管件_不锈钢承插管件_锻钢高压管件-温州科正阀门管件有限公司 |