首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Graph:列出从根到各种类型的对象的所有路径

SQL Graph:列出从根到各种类型的对象的所有路径
EN

Stack Overflow用户
提问于 2019-09-26 22:05:38
回答 1查看 20关注 0票数 0

给定产品部件层次结构:

代码语言:javascript
运行
复制
Car -> BodyWork
 |
 V
Wheel -> Tyre

以及某些具有供应商信息的部件

代码语言:javascript
运行
复制
Car -> Tesla
Tyre -> Continental

如何列出通向零件和可能的供应商的所有路径?对于到达的部件或供应商,还应该有特定的列,可能包含空值。

假设有一条路通向不同种类的东西(零件、供应商),查询将返回所有可到达的东西,列出路径,并将不同类型的对象返回到不同的列中,否则这些列将设置为NULL。

EN

回答 1

Stack Overflow用户

发布于 2019-09-26 22:05:38

代码语言:javascript
运行
复制
CREATE TABLE PRODUCT (
    ProductID int not null identity primary key,
    ProductName varchar(50) 
) AS Node;

INSERT INTO PRODUCT(ProductName) VALUES ('Car'),('BodyWork'),('Wheel'),('Tyre');

CREATE TABLE SUPPLIER (
    SuppierID int not null identity primary key,
    SupplierName varchar(50)    
) AS Node;

INSERT INTO SUPPLIER(SupplierName) VALUES ('Continental'),('Tesla');

CREATE TABLE HAS_PART AS EDGE;

INSERT INTO HAS_PART ($from_id, $to_id)
VALUES ((SELECT $node_id FROM PRODUCT WHERE ProductName='Car'), (SELECT $node_id FROM PRODUCT WHERE ProductName='BodyWork'))
,((SELECT $node_id FROM PRODUCT WHERE ProductName='Car'), (SELECT $node_id FROM PRODUCT WHERE ProductName='Wheel'))
,((SELECT $node_id FROM PRODUCT WHERE ProductName='Wheel'), (SELECT $node_id FROM PRODUCT WHERE ProductName='Tyre'));

CREATE TABLE SUPPLIED_BY AS EDGE;

INSERT INTO SUPPLIED_BY ($from_id, $to_id)
VALUES ((SELECT $node_id FROM PRODUCT WHERE ProductName='Car'), (SELECT $node_id FROM SUPPLIER WHERE SupplierName='Tesla'))
,((SELECT $node_id FROM PRODUCT WHERE ProductName='Tyre'), (SELECT $node_id FROM SUPPLIER WHERE SupplierName='Continental'));

SELECT * FROM HAS_PART;
SELECT * FROM SUPPLIED_BY;

CREATE VIEW All_nodes AS
SELECT ProductID, ProductName, NULL AS SupplierID, NULL AS SupplierName, ProductName AS NodeName FROM PRODUCT
UNION ALL
SELECT NULL, NULL, SuppierID, SupplierName , SupplierName AS NodeName FROM SUPPLIER;

CREATE VIEW All_edges AS
SELECT * FROM HAS_PART
UNION ALL
SELECT * FROM SUPPLIED_BY;

SELECT
       P1.ProductID,
       P1.ProductName,
       COUNT(P2.NodeName) WITHIN GROUP (GRAPH PATH) AS [Depth],
       STRING_AGG(P2.NodeName,'->') WITHIN GROUP (GRAPH PATH) AS [Assembly],
       LAST_VALUE(P2.ProductID) WITHIN GROUP (GRAPH PATH) AS [Final Product ID],
       LAST_VALUE(P2.SupplierID) WITHIN GROUP (GRAPH PATH) AS [Final Supplier ID],
       LAST_VALUE(P2.ProductName) WITHIN GROUP (GRAPH PATH) AS [Final Product Name],
       LAST_VALUE(P2.SupplierName) WITHIN GROUP (GRAPH PATH) AS [Final Supplier Name]
FROM
       All_nodes P1,
       All_nodes FOR PATH P2,
       All_edges FOR PATH HP
WHERE MATCH(SHORTEST_PATH(P1(-(HP)->P2)+))
AND P1.ProductID = 1
ORDER BY P1.ProductID;

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58118607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档