Oracle
 sql >> Baza danych >  >> RDS >> Oracle

SQL - Tworzenie asocjacji między polami (relacja przechodnia)

Cóż, nie mogę nic powiedzieć o ORACLE, ale można to zrobić za pomocą rekurencyjnego CTE na serwerze sql. Oto moje przykładowe rozwiązanie, robi to, o co prosiłeś, zakładając, że masz tabelę, która odwzorowuje relacje wiele-do-wielu z jednej tabeli do siebie

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak zadeklarować SQLCA.SQLERRD?

  2. Jak przypisać licznik na podstawie warunku

  3. count(*) nie można wybrać w PL/SQL

  4. Dlaczego Oracle varchar2 ma obowiązkowy rozmiar jako parametr definicji?

  5. Filtr zapytań Oracle SQL w JOIN ON vs WHERE