SQL - Creating associations between fields (Transitive relationship)

后端 未结 1 1220
悲哀的现实
悲哀的现实 2021-01-29 01:38

I have a sql table that contains a list of affiliations where Entity A owns Entity B, Entity B owns Entity C, etc... I don\'t have any sql text to include here because I\'m not

相关标签:
1条回答
  • 2021-01-29 02:03

    Well i cant say anything for ORACLE, but you could manage it with recursive CTE in sql server. Heres my sample solution, it does what you asked for assuming that you have a table witch maps relation many-to-many from one table to itself

    DECLARE @testData table (EntityID int, EntityName varchar(1))
    DECLARE @EntityRelations table (EntityID1 int, EntityID2 int)
    
    INSERT INTO @testData
    SELECT 1, 'A'
    UNION
    SELECT 2, 'B'
    UNION
    SELECT 3, 'C'
    UNION
    SELECT 4, 'D'
    UNION
    SELECT 5, 'E'
    UNION
    SELECT 6, 'F'
    UNION
    SELECT 7, 'G'
    UNION
    SELECT 8, 'Y'
    UNION
    SELECT 9, 'Z'
    
    INSERT INTO @EntityRelations
    SELECT 1, 2
    UNION
    SELECT 9, 2
    UNION
    SELECT 8, 2
    UNION
    SELECT 2, 3
    UNION
    SELECT 2, 4
    UNION
    SELECT 4, 5
    UNION
    SELECT 6, 7;
    
    
    WITH Affiliations (EntityID, Entity1Name, Entity2Name) AS
    (
        SELECT r.EntityID1
              ,e.EntityName as Entity1Name
              ,e2.EntityName as Entity2Name
        FROM @EntityRelations r
            JOIN @testData e ON e.EntityID = r.EntityID1
            JOIN @testData e2 ON e2.EntityID = r.EntityID2
    
        UNION ALL
    
        SELECT r.EntityID1
              ,e.EntityName as Entity1Name
              ,e2.EntityName as Entity2Name
        FROM @EntityRelations r
            JOIN @testData e ON e.EntityID = r.EntityID1
            JOIN @testData e2 ON e2.EntityID = r.EntityID2
            JOIN Affiliations a ON a.EntityID = r.EntityID2
    )
    
    ,AffiliationsReverse (EntityID, Entity1Name, Entity2Name) AS
    (
        SELECT r.EntityID2
              ,e.EntityName as Entity1Name
              ,e2.EntityName as Entity2Name
        FROM @EntityRelations r
            JOIN @testData e ON e.EntityID = r.EntityID1
            JOIN @testData e2 ON e2.EntityID = r.EntityID2
    
        UNION ALL
    
        SELECT r.EntityID2
              ,e.EntityName as Entity1Name
              ,e2.EntityName as Entity2Name
        FROM @EntityRelations r
            JOIN @testData e ON e.EntityID = r.EntityID1
            JOIN @testData e2 ON e2.EntityID = r.EntityID2
            JOIN AffiliationsReverse a ON a.EntityID = r.EntityID1
    )
    
    
    SELECT DISTINCT EntityName
    FROM
    (
    SELECT a.Entity1Name AS EntityName
    FROM Affiliations a
        JOIN AffiliationsReverse ar ON ar.EntityID = a.EntityID
    
    UNION
    
    SELECT a.Entity2Name AS EntityName
    FROM Affiliations a
        JOIN AffiliationsReverse ar ON ar.EntityID = a.EntityID
    
    UNION
    
    SELECT ar.Entity1Name AS EntityName
    FROM Affiliations a
        JOIN AffiliationsReverse ar ON ar.EntityID = a.EntityID
    
    UNION
    
    SELECT ar.Entity2Name AS EntityName
    FROM Affiliations a
        JOIN AffiliationsReverse ar ON ar.EntityID = a.EntityID
    
    
    ) s
    
    0 讨论(0)
提交回复
热议问题