Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Намиране на родителски идентификатор от най-високо ниво

Още един по-кратък CTE :

WITH cte AS(
      SELECT *, id AS topparent 
      FROM t 
      WHERE parentid IS NULL
  UNION ALL
      SELECT t.*, c.topparent 
      FROM t JOIN cte c ON c.id = t.parentid
      WHERE t.id <> t.parentid
)
SELECT * FROM cte

Тествано тук:SQL Fiddle

РЕДАКТИРАНЕ :Този проклет SQLfiddle отново не реагира. Тествайте DDL кода по-долу

CREATE  table t (id INT, parentid INT);
INSERT INTO T VALUES (1  , NULL );
INSERT INTO T VALUES (2  , 1    );           
INSERT INTO T VALUES (3  , 2    );          
INSERT INTO T VALUES (9  , NULL );          
INSERT INTO T VALUES (5  , 9    );          
INSERT INTO T VALUES (6  , 5    );          
INSERT INTO T VALUES (25 , NULL );          
INSERT INTO T VALUES (30 , 25   );


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL:Агрегиране на низове заедно

  2. SQL Server 2005 - Намерете кои съхранени процедури се изпълняват към определена таблица

  3. Как да върна две колони от първата таблица, ако само една колона частично съвпада с втората?

  4. Как да използвате израза IF/ELSE за актуализиране или създаване на нов запис на xml възел в Sql

  5. Как да използвам функцията CONCAT в SQL Server 2008 R2?