1

これは私が最近インタビューで尋ねられた質問でした:

組織にはさまざまなタイプのユーザーがいます: Junior(上司) Supervisor(上司) Manager(上司) CEO.

この単一の単純化されたテーブル スキーマに合意しました。ユーザー :{userId, userName, UserType(J, S, M, C), bossUserId}

Q :Junior userId = 11の従業員の完全な組織階層を判別する単一のクエリを作成します。

サンプルデータ :

ここに画像の説明を入力

答えは =>PQR2 --> GHI2 --> DEF1 --> ABC1

これが私の解決策でした:

select e1.userName, e2.userName, e3.userName, e4.userName from 
abc e1 inner join users e2 on e1.bossUserId = e2.userId
inner join users e3 on e2.bossUserId = e3.userId
inner join users e4 on e3.bossUserId = e4.userId
where e1.userId = 11;

4回の自己参加は恐ろしいことだとは思いますが、他に何も考えられませんでした。インタビュアーは、もっと良い方法があり、データが表示されるだろうと私に言いました columnwise。(ある場合は最大値を使用of 2 self joins)

もう 1 つの可能性は、ストアド プロシージャを作成することでしたが、これも単一のクエリではありません。

誰でもこれで私を助けることができますか?

4

1 に答える 1

1

コメントに続いて、MS SQL(および他の人も同様)でこれを行うことができます

;with cte as (
    select *, 0 as level from yourtable
    union all 
    select cte.id, t2.name, t2.ut, t2.bossid, level+1
    from cte
        inner join yourtable t2 on cte.bossid = t2.id
)
    select name, ut from cte
    where id=11
    order by level

それはあなたに

pqr2    j
ghi2    s
def1    m
abc1    c

ただし、MySQLはこの構成をサポートしていません。

于 2012-11-28T14:41:44.123 に答える