2013-02-10 6 views
1

다음은이 질문의 목적 상 내 문제를 단순화 한 것입니다. 나는 두 개의 테이블을 가지고있다.두 테이블을 결합하여 여러 행을 반환하는 방법

테이블 프로필 :

TABLE profile 
profile_id | first_name | last_name 
1   | David   | Battery 
2   | John   | Motor 

표 known_names는 :

TABLE known_names 
profile_id | first_name 
1   | A 
1   | B 
1   | C 
2   | X 
2   | Y 
2   | X 

내가 달성하기 위해 노력하고있어 profile.last_name profile.profile_id = known_names.profile_id 함께 출력 known_names.first_name이다. 그러나 결과의 행 중 하나에 profile.first_name 및 profile.last_name을 출력하려고합니다.

SELECT profile_id, first_name, last_name FROM profile CROSS JOIN known_names ON known_names.profile_id = profile.profile_id WHERE profile.first_name = 'David' 

결과의 예는 다음과 같습니다 :

profile_id | first_name | last_name 
1   | David   | Battery 
1   | A    | Battery 
1   | B    | Battery 
1   | C    | Battery 

그래서 쿼리 (구문이 잘못이고, 나는이 작업을 수행 할 수있는 올바른 쿼리를 찾고 있어요)과 같이 보일 수 있습니다

어떻게 달성 할 수있는 쿼리를 작성할 수 있습니까?

+0

내 대답을 참조하십시오. 이것에 대해 –

답변

2

이 ::

Select t.profileId, t.firstName, t.lastName 
    FROM 
(
SELECT 
     p.profile_id as profileId, 
     p.first_name as firstName, 
     p.first_name as first_Name, 
     p.last_name as lastName 
     FROM profile p 

    UNION 

     SELECT 
     p.profile_id as profileId, 
     k.first_name as firstName, 
     p.first_name as first_Name, 
     p.last_name as lastName 
     FROM profile p, 
     known_names k 
     WHERE k.profile_id = p.profile_id 
) t 
where t.first_Name='David' 

SQL-Fiddle

+0

고마워요,하지만 이것은 기본적으로 '내부 조인'입니다. 내부 조인은 p.first_name, k.first_name을 결과의 다른 행으로 인쇄하지 않기 때문에 제가 찾고있는 것이 아닙니다. – Hengjie

+0

내 쿼리를 편집했습니다. 확인하십시오 ... –

+0

감사합니다. 내 질문에 대답하지만'AND p.first_name = 'David''을 두 번 쓸 필요가 없습니다. 나는 실제 문제가 약 5-10의 WHERE 조건을 요구하기 때문에 이것을 묻는다. – Hengjie

0

SELECT a.*, 
     b.first_name other_FirstName 
FROM profile a 
     INNER JOIN known_names b 
      ON a.profile_ID = b.profile_ID 
// WHERE a.first_Name = '' 
ORDER BY a.profile_id, a.first_Name 

SELECT a.* 
FROM profile a 
WHERE first_name = 'david' 
UNION 
SELECT c.profile_id, c.first_name, d.last_name 
FROM profile b 
     INNER JOIN known_names c 
      ON b.profile_ID = c.profile_ID 
     CROSS JOIN 
     (
      SELECT last_Name 
      FROM profile 
      WHERE first_name = 'david' 
     ) d 
WHERE b.first_name = 'david' 

, 친절 아래 링크를 방문 조인에 대해 더 많은 지식을 얻을 수 :

+0

어때요? –

+0

WHERE 절을 복제 할 필요없이이 작업을 수행 할 수있는 방법이 있습니까? – Hengjie

1

를 확인 시도를 profile_id를 사용할 수 있다고 가정합니다. 오히려 FIRST_NAME보다 쿼리에 입력으로 :

SELECT 
    p.profile_id AS profileId, 
    p.first_name AS firstName, 
    p.last_name AS lastName 
    FROM profile p 
    WHERE p.profile_id = 1 

UNION 

SELECT 
    k.profile_id AS profileId, 
    k.first_name AS firstName, 
    p.last_name AS lastName 
    FROM known_names k 
    INNER JOIN profile p ON p.profile_id = k.profile_id 
    WHERE k.profile_id = 1 

http://www.sqlfiddle.com/#!2/fa421/18

1

나는 종종 GROUP BY WITH ROLLUP를 사용하지 않을 것을 인정해야한다,하지만 난 UNION을 사용하지 않고 귀하의 질문에 대답하기 위해 그것을 사용하고 싶었 검색어 :

SELECT 
    profile_id, 
    COALESCE(first_name_k, first_name_p) First_Name, 
    Last_Name 
FROM (
    SELECT 
    p.profile_id, 
    k.first_name as first_name_k, 
    p.first_name as first_name_p, 
    p.last_name 
    FROM 
    profile p inner join known_names k 
    ON k.profile_id = p.profile_id 
    WHERE 
    p.first_name='David' 
    GROUP BY 
    p.profile_id, 
    k.first_name WITH ROLLUP 
) s 
WHERE 
    profile_id IS NOT NULL 
ORDER BY 
    first_name_k IS NOT NULL, 
    COALESCE(first_name_k, first_name_p) 

here을 참조하십시오.

관련 문제