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

Рекурсивен cte sql с ниво на йерархия

Не сте ни казали как знаете дали даден потребител има права върху даден идентификатор. Това е необходима информация. Ще сложа код по-долу, който предполага, че добавяте колона към вашата заявка, наречена hasRights и че тази колона ще има нулева стойност, ако потребителят няма права и стойност единица, ако има. Може да се наложи да коригирате това, тъй като нямам данни за тестване, но се надявам, че ще ви доближи.

По принцип заявката се променя, за да добави само 1 към нивото, ако потребителят има права. Той също така добавя само към пътя за сортиране, ако потребителят има права, в противен случай се добавя празен низ. Така че, ако идентификатори 8 и 9 са единствените елементи, до които потребителят има достъп, трябва да видите нива 1 и 2 и пътища за сортиране, подобни на "5/8/9", а не на "5/6/8/9". Ако все още не можете да го накарате да работи, ще ни помогне изключително много, ако публикувате примерна схема в SqlFiddle.

WITH Tree
AS (
SELECT
    id,
    parent,
    0 AS Level,
    id AS Root,
    hasRights AS HasRights,
    CAST(id AS VARCHAR(MAX)) AS Sort,
    user_id
FROM SourceTable
WHERE parent IS NULL

UNION ALL

SELECT 
    st.id,
    st.parent,
    Level + st.hasRights AS Level,
    st.parent AS Root,
    st.hasRights AS HasRights,
    uh.sort + CASE st.hasRights WHEN 0 THEN '' ELSE '/' + CAST(st.id AS VARCHAR(20)) END AS Sort,
    st.user_id
FROM SourceTable AS st
    JOIN Tree uh ON uh.id = st.parent    
)

SELECT * FROM Tree AS t
    JOIN UserTable AS ut ON  ut.id = t.user_id AND ut.user_id = '141F-4BC6-8934'
ORDER BY Sort


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вземете AVG, пренебрегвайки Null или Zero стойности

  2. T-SQL премахва всички небуквени и нецифрови знаци

  3. Как да подобрим производителността за филтриране по дата и час в SQL Server?

  4. Как да извлека данни от база данни на SQL Server в C#?

  5. Стойност на производителността на водачите COMB