2017-12-15 2 views
1

JobとUserという2つのテーブルがあり、いくつかのレコードをまとめようとしています。ジョブは、ユーザー、およびユーザーと結合する必要があります。構造は次のとおりです。SQL Self Join + Another Joinが動作しない

JobID | OwnerID | ClientName 
    1 | 1 | Corey 
----------------------------- 
UserID | ManagerID | Name | Email 
    1 |  2  | Jon Smith | [email protected] 
    2 |   | Jane Doe | [email protected] 

ユーザーの名前に加えて、マネージャの電子メールアドレスを含むテーブルを取得しようとしています。私のクエリは次のとおりです。

SELECT 
     Job.ClientName as 'ClientName', 
     U1.Name as 'SalesPersonName', 
     U2.Email as 'ManagerEmail' 
    FROM 
     Job 
    INNER JOIN User U1 ON Job.OwnerID = U1.UserID 
    INNER JOIN User U2 ON U1.UserID = U2.ManagerID 
    WHERE 
     Job.ID = '1' 

これは、すべてのジョブのデータを引き出し、そしてU1のすべてのデータ...しかし、U2移入するために失敗している - 管理者の情報を。

私は自己結合で何かがうんざりしていると思います。クエリが検証されるので、私はそれが何であるかを犠牲にしています。

ご指摘いただきありがとうございます。

注:上記の表/列名は、無実を保護するために簡略化されています。

答えて

1
あなたの最後の JOINのフィールド上の表の別名を並置ように見えます

この:FULL JOIN User U2 ON U1.UserID = U2.ManagerID

このことが必要です。FULL JOIN User U2 ON U2.UserID = U1.ManagerID

全クエリ:

SELECT 
    Job.ClientName as 'ClientName', 
    U1.Name as 'SalesPersonName', 
    U2.Email as 'ManagerEmail' 
FROM 
    Job 
FULL JOIN User U1 ON Job.OwnerID = U1.UserID 
FULL JOIN User U2 ON U2.UserID = U1.ManagerID 
WHERE 
    Job.ID = 1 --removed ticks here, assuming int column 

注:togに参加しないレコードがない限り、FULL JOINは必要ありません。結果セットの値がNULLであるレコードを保存したいとします。提供された例では、基本的なINNER JOINは動作しますが、多分あなたは、私はそれを左に設定あなたの本当のデータのためのFULL JOINが必要

注2:userは、多くのDBMSの予約語であると使用した場合、あなたの頭痛を引き起こす可能性がありますtablenameとして

+0

私の部分でうんざりなミス。それはあなたにナッツを動かす小さな事をすばらしくしています。私のためにこれを見つけてくれてありがとう! – Corey

+0

@Corey良いコーディングの努力は、誰かが愚かなものをキャッチするためにあなたの肩を見ている必要があります。 :) –