Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Rekurencyjnie pobieraj wszystkie dane na podstawie identyfikatora rodzica

Można to zrobić w SQL Server 2005 i nowszych, używając wspólnych wyrażeń tabel (CTE). Oto świetny link z MSDN opisujący zapytania rekurencyjne:Kwerendy rekurencyjne używające wspólnych wyrażeń tabel

Oto przykład:

Jeśli wyobrazisz sobie hierarchiczną linię osób, to zapytanie pozwoli Ci zobaczyć całą linię dowolnej osoby ORAZ obliczy jej miejsce w hierarchii. Można go zmodyfikować, aby znaleźć dowolną relację podrzędną.

Zamiast identyfikatora osoby, zamieniasz identyfikator wiersza, którego używasz jako rodzica.

--Create table of dummy data
create table #person (
personID integer IDENTITY(1,1) NOT NULL,
name      varchar(255) not null,
dob       date,
father    integer
);

INSERT INTO #person(name,dob,father)Values('Pops','1900/1/1',NULL);  
INSERT INTO #person(name,dob,father)Values('Grandma','1903/2/4',null);
INSERT INTO #person(name,dob,father)Values('Dad','1925/4/2',1);
INSERT INTO #person(name,dob,father)Values('Uncle Kev','1927/3/3',1);
INSERT INTO #person(name,dob,father)Values('Cuz Dave','1953/7/8',4);
INSERT INTO #person(name,dob,father)Values('Billy','1954/8/1',3);

DECLARE @OldestPerson INT; 
SET @OldestPerson = 1; -- Set this value to the ID of the oldest person in the family

WITH PersonHierarchy (personID,Name,dob,father, HierarchyLevel) AS
(
   SELECT
      personID
      ,Name
      ,dob
      ,father,
      1 as HierarchyLevel
   FROM #person
   WHERE personID = @OldestPerson

   UNION ALL

   SELECT
    e.personID,
      e.Name,
      e.dob,
      e.father,
      eh.HierarchyLevel + 1 AS HierarchyLevel
   FROM #person e
      INNER JOIN PersonHierarchy eh ON
         e.father = eh.personID
)

SELECT *
FROM PersonHierarchy
ORDER BY HierarchyLevel, father;

DROP TABLE #person;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wybierz liczbę z innej tabeli do każdego wiersza w wierszach wynikowych

  2. Blokowanie, blokowanie, blokowanie w DBA Drzwi z blokowaniem SQL Server

  3. Serwer a źródło danych w ciągu połączenia

  4. Budowanie modelu uczenia maszynowego za pomocą SQL Server, ML.NET i C#

  5. Procesor kwerend nie może utworzyć planu kwerendy z powodu wskazówek zdefiniowanych w tej kwerendzie. Wyślij zapytanie ponownie i bez użycia SET FORCEPLAN