我有一个图式

CREATE TABLE tbl_Attribute 
(  
    AttributeID INT NOT NULL,  
    Name VARCHAR(100) NOT NULL 
)

INSERT INTO tbl_Attribute (AttributeID, Name) 
VALUES (1, 'Genius'), (2, 'Smart'), (3, 'Pretty'), (4, 'Ugly')

CREATE TABLE tbl_Person 
( 
    PersonID INT NOT NULL,  
    Name VARCHAR(100) NOT NULL,  
    ParentPersonID INT NULL 
)

INSERT INTO tbl_Person (PersonID, Name, ParentPersonID) 
VALUES (1, 'GrandMother', NULL), (2, 'Mother', 1), 
       (3, 'Daughter', 2), (4, 'Son', 2)

CREATE TABLE tbl_PersonAttribute 
(
    PersonID INT NOT NULL,  
    AttributeID INT NOT NULL 
)

INSERT INTO tbl_PersonAttribute (PersonID, AttributeID) 
VALUES 
  (1, 1) -- GrandMother - Genius
, (2, 2) -- Mother - Smart
, (3, 3) -- Daughter - Pretty
, (4, 4) -- Son - Ugly

我正在try 获取显示所有属性(self +继承)的人的行

到目前为止,我有这样一个SQL:

WITH PersonAttrCTE AS 
(
    -- get base (parent is null)
    SELECT 
        p.PersonID,
        p.Name,
        a.Name AS AttributeName,
        CAST('Myself' AS VARCHAR(100)) [Inherit]
    FROM 
        tbl_Person p
    INNER JOIN 
        tbl_PersonAttribute pa ON p.PersonID = pa.PersonID
    INNER JOIN 
        tbl_Attribute a ON pa.AttributeID = a.AttributeID
    WHERE 
        p.ParentPersonID IS NULL

    UNION ALL

    -- get the direct attributes
    SELECT 
        p.PersonID,
        p.Name,
        a.Name AS AttributeName,
        pCTE.Name [Inherit]
    FROM 
        tbl_Person p
    INNER JOIN 
        PersonAttrCTE pCTE ON p.ParentPersonID = pCTE.PersonID
    INNER JOIN 
        tbl_PersonAttribute pa ON p.PersonID = pa.PersonID
    INNER JOIN 
        tbl_Attribute a ON pa.AttributeID = a.AttributeID

    UNION ALL

    -- get inherited attributes
    SELECT 
        p.PersonID,
        p.Name,
        a.Name AS AttributeName,
        pac.Name [Inherit]
    FROM 
        tbl_Person p
    INNER JOIN 
        PersonAttrCTE pac ON p.ParentPersonID = pac.PersonID
    INNER JOIN 
        tbl_PersonAttribute pa ON pac.PersonID = pa.PersonID
    INNER JOIN 
        tbl_Attribute a ON pa.AttributeID = a.AttributeID
)
SELECT DISTINCT
    *
FROM 
    PersonAttrCTE c
ORDER BY 
    PersonID

不知何故,它在一定程度上起到了作用,因为继承没有达到最高层.

我是这样期待的

-- Mother should have both Smart (Myself) and Genius (GrandMother)
-- Daughter should have Pretty (Myself), Smart (Mother), Genius (GrandMother)
-- Son should have Ugly (Myself), Smart (Mother), Genius (GrandMother)

添加了小提琴就绪http://sqlfiddle.com/#!18/3a25e/1

如有任何帮助,我们将不胜感激

推荐答案

我相信这会得到您想要的结果:

WITH PersonAttrCTE AS 
(
    -- get all root values
    SELECT
        p.PersonID,
        p.Name,
        a.Name AS AttributeName,
        CAST('Myself' AS VARCHAR(100)) [Inherit]
    FROM
        tbl_Person p
    INNER JOIN
        tbl_PersonAttribute pa ON p.PersonID = pa.PersonID
    INNER JOIN
        tbl_Attribute a ON pa.AttributeID = a.AttributeID

    UNION ALL

    -- get inherited attributes from all levels
    SELECT 
        p.PersonID,
        p.Name,
        pac.AttributeName,
        CASE WHEN pac.Inherit = 'Myself' THEN pac.Name ELSE pac.Inherit END [Inherit]
    FROM 
        tbl_Person p
    INNER JOIN 
        PersonAttrCTE pac ON p.ParentPersonID = pac.PersonID
)
SELECT
    *
FROM 
    PersonAttrCTE c
ORDER BY 
    PersonID

输出:

PersonID Name AttributeName Inherit
1 GrandMother Genius Myself
2 Mother Smart Myself
2 Mother Genius GrandMother
3 Daughter Genius GrandMother
3 Daughter Smart Mother
3 Daughter Pretty Myself
4 Son Ugly Myself
4 Son Smart Mother
4 Son Genius GrandMother

Sql相关问答推荐

Select 最大值,但当并列时,从其他列 Select 最大值

如何在Snowflake SQL存储过程中传递LIMIT和OFFSET的参数?

SQL将 Select 查询作为新列添加到另一个 Select 查询

LEFT JOIN不显示计数0我期望的方式

编写一个SQL查询来返回收视率较高的类型,并取这些收视率的平均值,我该如何做呢?

Access中执行INSERT INTO查询时出现错误消息

PostgreSQL使用SQL子查询在时间间隔内 Select 数据

SQL数据库规范化与数据插入

使用 SQL 将列添加到 Access 数据库时出错

如何为 ActiveRecord 联接应用附加条件

使用长 IN 子句的 SQL 优化

如何在 SQL 中将两行(或多行)jsonb 数组合并为一行

SQL ORACLE - 查找连续天数

SQL Server: 将JSON对象数组转换为表格格式

为什么在事务中未被后续使用的CTE执行SELECT...FOR UPDATE无效?

在 postgresql 中保存带有时间戳的几何类型数据

如何筛选 GROUP BY 结果? HAVING 没有产生预期的结果

在给定列中具有特定值的行与 SQL 中的总行数的比率

Lag() 获取snowflake的值变化

从不同的表中 Select 包含单词列表的记录