2017-12-27 11 views
1

私はいくつかのSQLの専門家の助言を求めたいと思います。2ユニオンsqlステートメントから別のレコードを取得

スタッフと卒業生のテーブルから著者名を取得するためのSQL文を作成しました。著者の名前はどちらの表にもあります。つまり、著者名が職員であれば論理があり、それ以外の場合は卒業生の表を探します。

ここに私のSQLステートメントがありますが、それはスタッフと卒業生の両方のテーブルから同じ著者名を表示しているようです。

SELECT DISTINCT AP.Author_name, P.people_id, P.Name, P.Journal_name, AP.Author_sortorder FROM `Paper_Author` AS AP LEFT JOIN `People` AS P ON (AP.Author_id = P.people_id) WHERE AP.Paper_id =3838 

UNION 

SELECT DISTINCT AN.Author_name, N.People_id, N.Name, N.Journal_name, AN.Author_sortorder FROM `Paper_Author` AS AN LEFT JOIN `Alumni` AS N ON (AN.Author_id = N.People_id) WHERE AN.Paper_id =3838 ORDER BY Author_sortorder LIMIT 0 , 30 

結果:

people_id-- Author_name-- Journal_name-- 
    1  Name1    A1   
    2  Name2    B1   
    3  Name3    C1 
    3  Name3    C1 
    4  Name4    D 
    4  Name4 

期待される結果:

people_id-- Author_name-- Journal_name-- 
    1   Name1   A1   
    2   Name2   B1   
    3   Name3   C1 
    4   Name4   D 
+0

なぜ「グループ化」を使用しないのですか? – Naga

+0

現在の出力の最後のレコードにジャーナル名がないのはなぜですか? –

答えて

1

これは、おそらく追加することで解決することができますサブクエリ

SELECT DISTINCT * FROM (
    SELECT DISTINCT AP.Author_name, P.people_id, P.Name, P.Journal_name, AP.Author_sortorder FROM `Paper_Author` AS AP LEFT JOIN `People` AS P ON (AP.Author_id = P.people_id) WHERE AP.Paper_id =3838 

    UNION 

    SELECT DISTINCT AN.Author_name, N.People_id, N.Name, N.Journal_name, AN.Author_sortorder FROM `Paper_Author` AS AN LEFT JOIN `Alumni` AS N ON (AN.Author_id = N.People_id) WHERE AN.Paper_id =3838 ORDER BY Author_sortorder LIMIT 0 , 30 
); 
+0

私はそのサブセレクトにエイリアスが必要であり、それがプライマリステートメントで参照される必要があると思います。 – kambythet

+0

この答えが正しいならば、それは 'People'と' Alumni'テーブルからの情報が与えられた人にとって常に同じであることを意味します。可能ですが、そう思わないでしょう。 –

1

として、元の結果を使用して選択しますthとの難しさ問題は、PeopleまたはAlumniテーブルからの情報が必要な場合があることです。適切な情報を含む単一のテーブルに参加したいだけです。以下のクエリの複雑さの大部分は、各人物に適切なメタデータを含むテーブルを作成することです。

SELECT 
    pa.Author_name, 
    pa.Author_sortorder, 
    t1.people_id, 
    t1.Name, 
    t1.Journal_name 
FROM Paper_Author pa 
LEFT JOIN 
(
    SELECT people_id, Name, Journal_name, 0 AS source 
    FROM People 
    UNION ALL 
    SELECT people_id, Name, Journal_name, 1 
    FROM Alumni 
) t1 
    ON pa.Author_id = t1.people_id 
INNER JOIN 
(
    SELECT people_id, MIN(source) AS source 
    FROM 
    (
     SELECT people_id, 0 AS source 
     FROM People 
     UNION ALL 
     SELECT people_id, 1 
     FROM Alumni 
    ) t 
    GROUP BY people_id 
) t2 
    ON t1.people_id = t2.people_id AND 
     t1.source = t2.source 
WHERE 
    pa.Paper_id = 3838; 
関連する問題