2012-07-27 3 views
1

두 개의 테이블에 두 개의 서로 다른 종류의 엔티티가 있습니다.이 엔티티 중 몇 개만 공통 열로 결합하고 공통 열 중 하나로 정렬하려고합니다. 결과 테이블에서 각 행은 한 테이블의 행이나 다른 테이블의 행을 나타내야합니다. 이 같은 예를 들어, 용 테이블 :테이블을 조인하여 소스 테이블의 각 행에 대해 하나의 행을 얻는 방법은 무엇입니까?

CREATE TABLE apple (
    apple_id INT NOT NULL AUTO_INCREMENT, 
    acquired DATETIME NOT NULL, 
    is_fresh TINYINT, 
    PRIMARY KEY (apple_id) 
); 

'1', '2012-07-27 19:06:58', '1' 
'2', '2012-07-28 18:05:43', '0' 

CREATE TABLE orange (
    orange_id INT NOT NULL AUTO_INCREMENT, 
    acquired DATETIME NOT NULL, 
    is_yummy TINYINT, 
    PRIMARY KEY (orange_id) 
); 

'1', '2012-06-12 10:03:31', '0' 
'2', '2012-08-30 22:00:02', '1' 

같은 것 그들을 합류에 대한 쿼리의 내 생각 :

  1. :
    SELECT 
        IF(orange_id IS NULL, 'apple', 'orange') AS type, 
        IF(orange_id IS NULL, apple.acquired, orange.acquired) AS acquired, 
        is_fresh, 
        is_yummy 
    FROM apple CROSS JOIN orange ON apple_id IS NULL OR orange_id IS NULL 
    ORDER BY acquired ASC 
    
    'orange', '2012-06-12 10:03:31', NULL, '0' 
    'apple', '2012-07-27 19:06:58', '1', NULL 
    'apple', '2012-07-28 18:05:43', '0', NULL 
    'orange', '2012-08-30 22:00:02', NULL, '1' 
    

    내가이 쿼리에 몇 가지 문제를 참조

    CROSS JOIN의 작동 방식을 이해하면 쿼리가 매우 느려질 수 있습니다. 가능한 모든 사과 오렌지 조합을 통과 할 수 있습니까? 그렇지 않습니다. 더 빠른 방법이 있습니까?

  2. IF(...) 기능이보기 흉하게 들립니다. 그들은 정말로 필요합니까?

답변

1

이 방법이 문제의 해결 방법인지는 잘 모르겠습니다. 하지만 공용체를 사용하여 비슷한 출력을 낼 수 있습니다. 크로스 조인 (cross join)과 비교해 볼 때 더 빠른 조합이 될 것입니다.

+0

고마워, 그건 정확히 내가'JOIN's로 발명하려고 시도했던 바퀴의 종류이다. :) – Septagram