EMPLID、NAME、SUPERVISOR_ID の少なくとも 3 つの列を含むテーブルがあります。単一のクエリで、マネージャーの直属の部下を取得したいと思います。これには、WHERE
句で managerid が指定されたときに、下位のマネージャーから最下位のスタッフまでの直属の部下が含まれます。
誰が誰に報告するかを表示するクエリを作成できます。
SELECT MANAGER.[EMPLID] AS MANAGEREMPLID, MANAGER.[NAME], MANAGER.[SUPERVISOR_ID], STAFF.[EMPLID] AS STAFFEMPLID, STAFF.[NAME], STAFF.[SUPERVISOR_ID]
FROM MYHRTABLE AS MANAGER INNER JOIN MYHRTABLE AS STAFF
ON MANAGER.[EMPLID] = STAFF.[SUPERVISOR_ID]
ORDER BY MANAGER.[NAME], STAFF.[NAME]
または一見同じことをする再帰的なCTE
WITH MYCTE
AS (
SELECT [EMPLID], [NAME],[SUPERVISOR_ID] FROM
(SELECT [EMPLID], [NAME],
CASE WHEN [EMPLID] = [SUPERVISOR_ID] THEN NULL ELSE [SUPERVISOR_ID] END AS [SUPERVISOR_ID]
FROM MYHRTABLE) AS MYDATA
WHERE [SUPERVISOR_ID] IS NULL
UNION ALL
SELECT MYDATA.[EMPLID], MYDATA.[NAME],MYDATA.[SUPERVISOR_ID] FROM
(SELECT [EMPLID], [NAME],
CASE WHEN [EMPLID] = [SUPERVISOR_ID] THEN NULL ELSE [SUPERVISOR_ID] END AS [SUPERVISOR_ID]
FROM MYHRTABLE) AS MYDATA INNER JOIN MYCTE ON MYDATA.[SUPERVISOR_ID] = MyCTE.[EMPLID]
WHERE MYDATA.[SUPERVISOR_ID] IS NOT NULL)
SELECT * FROM MyCTE
(ケースステートメントは、最高のマネージャーが自分自身に報告するスーパーバイザーフィールドを持っているためです)
私が探していたのは、このクエリに emplid を与え、そのマネージャーに報告するスタッフまでずっと見ることができる機能でした。私の 2 つの例では、直属の部下を見ることができるように感じますが、残りの情報を見るには別の結合を行う必要があります。
そして、関連する2番目の質問ですが、これを調査している間、ほとんどの人は、それ自体に結合された最初のクエリを使用して解決できたと思うときに、再帰cteを使用してマネージャーの直属の部下を見つけることを解決しているようです。私が投稿した 2 つのクエリを考えると、それ自体に結合された同じテーブルを使用できるのに、なぜ再帰 CTE を使用して解決するのでしょうか? 同じ情報が返ってきたような?
それが何かを意味する場合、これは SQL Server 2012 または 2008 で実行されます。