sql >> Database teknologi >  >> RDS >> Oracle

SQL - Oprettelse af associationer mellem felter (Transitiv relation)

Nå, jeg kan ikke sige noget om ORACLE, men du kunne klare det med rekursiv CTE i sql-server. Her er min eksempelløsning, den gør hvad du bad om, forudsat at du har et bord, der kortlægger forholdet mange-til-mange fra et bord til sig selv

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



  1. Hvilken type JOIN skal bruges

  2. Får MySQL-syntaksfejl efter indsendelse af formularen

  3. Hvorfor justering af SQL-ydelse er den vigtigste evne til at håndtere databaser

  4. Autoinkrementering af et felt, indtil en bestemt betingelse er opfyldt mysql