第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

SQL Server CTE和遞歸示例

SQL Server CTE和遞歸示例

胡說叔叔 2019-07-09 10:25:16
SQL Server CTE和遞歸示例我從不在遞歸中使用CTE。我只是在讀一篇關(guān)于它的文章。本文在SQLServerCTE和遞歸的幫助下展示了員工信息。它基本上是向員工和他們的經(jīng)理展示信息。我無法理解這個查詢是如何工作的。以下是查詢: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 ManagerFROM cteReportsORDER BY EmpLevel, MgrID在這里,我發(fā)布了關(guān)于輸出是如何顯示的:enter image description here我只需要知道它是如何首先向經(jīng)理展示,然后在循環(huán)中展示他的下屬。我猜第一個SQL語句只觸發(fā)一次,并返回所有員工ID。第二個查詢重復(fù)觸發(fā),使用當(dāng)前管理器id查詢Employee所在的數(shù)據(jù)庫。請解釋SQL語句如何在內(nèi)部循環(huán)中執(zhí)行,并告訴我SQL執(zhí)行順序。謝謝。我的第二階段問題;WITH Numbers AS(    SELECT n = 1    UNION ALL    SELECT n + 1    FROM Numbers    WHERE n+1 <= 10)SELECT nFROM Numbers問題1)N的值是如何增加的?如果每次給N賦值,則N值可以增加,但只有第一次初始化N值。Q2)CTE和雇員關(guān)系的遞歸:當(dāng)我增加兩個經(jīng)理,在第二個經(jīng)理下面再增加幾個員工的時候,問題就開始了。我希望顯示第一個經(jīng)理詳細(xì)信息,并在下一行中只顯示與該經(jīng)理下屬相關(guān)的員工詳細(xì)信息。假設(shè)ID     Name      MgrID    Level---    ----      ------   -----1      Keith      NULL     12      Josh       1        23      Robin      1        24      Raja       2        35      Tridip     NULL     16      Arijit     5        27      Amit       5        28      Dev        6        3我想用CTE表達(dá)式以這種方式顯示結(jié)果。請告訴我如何修改我的SQL,我在這里給出的,以拉經(jīng)理-雇員關(guān)系。謝謝。我希望輸出是這樣的:ID          Name   MgrID       nLevel      Family----------- ------ ----------- ----------- --------------------1           Keith  NULL        1           13           Robin  1           2           12           Josh   1           2           14           Raja   2           3           15           Tridip NULL        1           27           Amit   5           2           26           Arijit 5           2           28           Dev    6           3           2這有可能.?
查看完整描述

3 回答

?
四季花海

TA貢獻(xiàn)1811條經(jīng)驗 獲得超5個贊

我還沒有測試您的代碼,只是試圖幫助您了解它是如何在注釋中運行的;


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

遞歸的最簡單例子CTE我可以想到說明它的運作是什么;


;WITH Numbers AS

(

    SELECT n = 1

    UNION ALL

    SELECT n + 1

    FROM Numbers

    WHERE n+1 <= 10

)

SELECT n

FROM Numbers

Q1)N的值是如何增加的。如果每次都將值賦值給N,則N值可以增加,但只有第一次初始化N值時才能增加N值。.


A1:在這種情況下,N不是變量。N是化名。它相當(dāng)于SELECT 1 AS N..這是一種個人偏好的語法。中有兩種主要的混疊列方法。CTE在……里面T-SQL..我包括了一個簡單的CTE在……里面Excel以一種更熟悉的方式來說明正在發(fā)生的事情。


--  Outside

;WITH CTE (MyColName) AS

(

    SELECT 1

)

-- Inside

;WITH CTE AS

(

    SELECT 1 AS MyColName

    -- Or

    SELECT MyColName = 1  

    -- Etc...

)

Excel_CTE


問題2)在這里,關(guān)于CTE和員工關(guān)系的遞歸,當(dāng)我在第二個經(jīng)理下面增加兩個經(jīng)理,再增加幾個員工,然后開始問題。我想顯示第一個經(jīng)理詳細(xì)信息,在接下來的行中,只有那些員工詳細(xì)信息才會出現(xiàn)那些從屬于該經(jīng)理的員工詳細(xì)信息。


A2:


這個密碼能回答你的問題嗎?


--------------------------------------------

-- 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

另一個具有樹結(jié)構(gòu)的SQL

SELECT ID,space(nLevel+

                    (CASE WHEN nLevel > 1 THEN nLevel ELSE 0 END)

                )+Name

FROM Hierarchy

ORDER BY Family, nLevel


查看完整回答
反對 回復(fù) 2019-07-09
?
POPMUISE

TA貢獻(xiàn)1765條經(jīng)驗 獲得超5個贊

我想概述一個簡短的語義平行,一個已經(jīng)正確的答案。

在“簡單”術(shù)語中,遞歸CTE可以從語義上定義為以下部分:

1:CTE查詢。也叫錨。

2:在(1)中對CTE進(jìn)行遞歸的CTE查詢,使用UNIONALL(或UNION或UNITE或INTERSECT),因此最終結(jié)果將相應(yīng)地返回。

3:拐角處/終止條件。默認(rèn)情況下,當(dāng)遞歸查詢返回的行/元組不多時。

下面是一個簡短的例子,可以清楚地說明情況:

;WITH SupplierChain_CTE(supplier_id, supplier_name, supplies_to, level)

AS

(

SELECT S.supplier_id, S.supplier_name, S.supplies_to, 0 as level

FROM Supplier S

WHERE supplies_to = -1    -- Return the roots where a supplier supplies to no other supplier directly


UNION ALL


-- The recursive CTE query on the SupplierChain_CTE

SELECT S.supplier_id, S.supplier_name, S.supplies_to, level + 1

FROM Supplier S

INNER JOIN SupplierChain_CTE SC

ON S.supplies_to = SC.supplier_id

)

-- Use the CTE to get all suppliers in a supply chain with levels

SELECT * FROM SupplierChain_CTE

說明:第一個CTE查詢返回沒有直接提供給任何其他供應(yīng)商的基本供應(yīng)商(如LEAS)(-1)。

第一次迭代中的遞歸查詢將獲取向錨返回的供應(yīng)商提供服務(wù)的所有供應(yīng)商。這個過程一直持續(xù)到條件返回元組為止。

UNION All在全部遞歸調(diào)用中返回所有元組。

另一個很好的例子可以找到。這里.

PS:要使遞歸CTE工作,關(guān)系必須具有要處理的分層(遞歸)條件。元素=元素.。你說對了。


查看完整回答
反對 回復(fù) 2019-07-09
  • 3 回答
  • 0 關(guān)注
  • 810 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號