SORU
11 Ocak 2013, Cuma


Sql CTE ve özyineleme örnek server

Hiç özyineleme ile CTE kullanın. Sadece üzerine bir makale okuyordum. Bu makalede, Sql server CTE ve özyineleme ile çalışan bilgisini gösterir. Temelde çalışanları ve yöneticisi bilgilerini gösteriyor. Bu sorgu nasıl çalıştığını anlamak mümkün değil. Burada sorgu:

WITH
  cteReports (EmpID, FirstName, LastName, MgrID, EmpLevel)
  AS
  (
    SELECT EmployeeID, FirstName, LastName, ManagerID, 1
    FROM Employees
    WHERE ManagerID IS NULL
    UNION ALL
    SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID,
      r.EmpLevel   1
    FROM Employees e
      INNER JOIN cteReports r
        ON e.ManagerID = r.EmpID
  )
SELECT
  FirstName   ' '   LastName AS FullName,
  EmpLevel,
  (SELECT FirstName   ' '   LastName FROM Employees
    WHERE EmployeeID = cteReports.MgrID) AS Manager
FROM cteReports
ORDER BY EmpLevel, MgrID

Burada çıkış gösteriyor hakkında gönderiyorum: enter image description here

Ben sadece ilk yöneticisi ve bir döngü içinde onun alt sonra gösteriyor. Deyimi sadece bir kez patlar ve tüm çalışanların kimlikleri döndüren ilk sql sanırım.

Ve ikinci sorguyu tekrar tekrar, hangi çalışanın şimdiki yöneticisi kimliği ile bulunduğu veritabanı sorgulama tetikler.

Sql deyimini yürütür nasıl bir iç döngü içinde açıklamak da bana sql yürütme sırasını söyle lütfen. Teşekkürler.

Soru 2 faz

;WITH Numbers AS
(
    SELECT n = 1
    UNION ALL
    SELECT n   1
    FROM Numbers
    WHERE n 1 <= 10
)
SELECT n
FROM Numbers

S 1) N değeri artan oluyor mu? eğer değeri N her zaman atanırsa o zaman N değeri artırılabilir ama zaman N sadece ilk değer başlatıldı.

Q 2) CTE ve işçi ilişkileri özyineleme:

İki yöneticileri ekliyorum ve ikinci yöneticisi altında bir kaç fazla çalışanı Ekle anda sorun başlıyor.

İlk yöneticisi ayrıntı ve bir sonraki satır olan Müdür bağımlı ilişki yalnızca çalışan ayrıntıları görüntülemek istiyorum.

Sanırım

ID     Name      MgrID    Level
---    ----      ------   -----
1      Keith      NULL     1
2      Josh       1        2
3      Robin      1        2
4      Raja       2        3
5      Tridip     NULL     1
6      Arijit     5        2
7      Amit       5        2
8      Dev        6        3

CTE ifadeleri ile bu şekilde sonuçlarını görüntülemek istiyorum. Sırayla burada yönetici-çalışan ilişkileri çekmeye verdim benim sql değiştirmek için ne söyle lütfen. Teşekkürler.

Çıkış bu gibi olmak istiyorum

ID          Name   MgrID       nLevel      Family
----------- ------ ----------- ----------- --------------------
1           Keith  NULL        1           1
3           Robin  1           2           1
2           Josh   1           2           1
4           Raja   2           3           1
5           Tridip NULL        1           2
7           Amit   5           2           2
6           Arijit 5           2           2
8           Dev    6           3           2

Bu mümkün mü...?

CEVAP
11 Ocak 2013, Cuma


Kodu test etmedim, yorum, nasıl çalıştığını anlamak için çalıştı;

WITH
  cteReports (EmpID, FirstName, LastName, MgrID, EmpLevel)
  AS
  (
-->>>>>>>>>>Block 1>>>>>>>>>>>>>>>>>
-- In a rCTE, this block is called an [Anchor]
-- The query finds all root nodes as described by WHERE ManagerID IS NULL
    SELECT EmployeeID, FirstName, LastName, ManagerID, 1
    FROM Employees
    WHERE ManagerID IS NULL
-->>>>>>>>>>Block 1>>>>>>>>>>>>>>>>>
    UNION ALL
-->>>>>>>>>>Block 2>>>>>>>>>>>>>>>>>    
-- This is the recursive expression of the rCTE
-- On the first "execution" it will query data in [Employees],
-- relative to the [Anchor] above.
-- This will produce a resultset, we will call it R{1} and it is JOINed to [Employees]
-- as defined by the hierarchy
-- Subsequent "executions" of this block will reference R{n-1}
    SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID,
      r.EmpLevel   1
    FROM Employees e
      INNER JOIN cteReports r
        ON e.ManagerID = r.EmpID
-->>>>>>>>>>Block 2>>>>>>>>>>>>>>>>>
  )
SELECT
  FirstName   ' '   LastName AS FullName,
  EmpLevel,
  (SELECT FirstName   ' '   LastName FROM Employees
    WHERE EmployeeID = cteReports.MgrID) AS Manager
FROM cteReports
ORDER BY EmpLevel, MgrID

Operasyonun kendi göstermek için düşünebilirim 14* *bir özyinelemeli en basit örnek;

;WITH Numbers AS
(
    SELECT n = 1
    UNION ALL
    SELECT n   1
    FROM Numbers
    WHERE n 1 <= 10
)
SELECT n
FROM Numbers

Q 1) değeri N artan oluyor. eğer N değeri için her zaman ata ise N değeri artırılabilir ama sadece ilk zaman N değeri başlatılamadı.

Bu durumda A1:, N bir değişken değil. N bir diğer adıdır. SELECT 1 AS N eşdeğerdir. Kişisel tercihi bir sözdizimi. T-SQL 20 *aliasing sütun 2 ana yöntem vardır. Excel 22 *basit bir analog deneyin ve neler olduğunu daha samimi bir şekilde göstermek için ekledim.

--  Outside
;WITH CTE (MyColName) AS
(
    SELECT 1
)
-- Inside
;WITH CTE AS
(
    SELECT 1 AS MyColName
    -- Or
    SELECT MyColName = 1  
    -- Etc...
)

Excel_CTE

Q 2) şimdi burada CTE ve çalışan ilişkisi özyineleme ben iki yöneticisi eklemek ve ikinci yöneticisi altında kaç işçi ekleyin sorun başlar an. ayrıntı ve sonraki satırlarda yalnızca çalışanın ayrıntıları Müdürü bağımlı olanlar gelecek ilk yöneticisi görüntülemek istiyorum

A2:

Bu kod, bu sorunun cevabı değil mi?

--------------------------------------------
-- Synthesise table with non-recursive CTE
--------------------------------------------
;WITH Employee (ID, Name, MgrID) AS 
(
    SELECT 1,      'Keith',      NULL   UNION ALL
    SELECT 2,      'Josh',       1      UNION ALL
    SELECT 3,      'Robin',      1      UNION ALL
    SELECT 4,      'Raja',       2      UNION ALL
    SELECT 5,      'Tridip',     NULL   UNION ALL
    SELECT 6,      'Arijit',     5      UNION ALL
    SELECT 7,      'Amit',       5      UNION ALL
    SELECT 8,      'Dev',        6   
)
--------------------------------------------
-- Recursive CTE - Chained to the above CTE
--------------------------------------------
,Hierarchy AS
(
    --  Anchor
    SELECT   ID
            ,Name
            ,MgrID
            ,nLevel = 1
            ,Family = ROW_NUMBER() OVER (ORDER BY Name)
    FROM Employee
    WHERE MgrID IS NULL

    UNION ALL
    --  Recursive query
    SELECT   E.ID
            ,E.Name
            ,E.MgrID
            ,H.nLevel 1
            ,Family
    FROM Employee   E
    JOIN Hierarchy  H ON E.MgrID = H.ID
)
SELECT *
FROM Hierarchy
ORDER BY Family, nLevel

Başka bir ağaç yapısı ile sql

SELECT ID,space(nLevel 
                    (CASE WHEN nLevel > 1 THEN nLevel ELSE 0 END)
                ) Name
FROM Hierarchy
ORDER BY Family, nLevel

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AginoEvolutionHD

    AginoEvoluti

    27 AĞUSTOS 2011
  • Austin Evans

    Austin Evans

    5 AĞUSTOS 2007
  • Bogdan Gabriel

    Bogdan Gabri

    5 Aralık 2006