2017-12-27 3 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

왜 'group by'을 사용하지 않습니까? – 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

그 subselect에 별명이 있어야하며 기본 명령문에서 참조되어야한다고 생각합니다. – kambythet

+0

이 답변이 정확하다면 'People'과 'Alumni' 테이블의 정보가 주어진 사람에게 항상 동일하다는 것을 암시합니다. 가능하지만 가능성은 희박합니다. –

1

어려움 문제는 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; 
관련 문제