2015-05-28 22 views
4

我需要FULL OUTER JOIN多個表格。我知道如何從here兩張表FULL OUTER JOIN。但我有幾張桌子,我無法將它們應用在他們身上。我怎樣才能實現它?
SQL代碼,如下:如何在MySQL中完整的OUTER JOIN多個表格

INSERT INTO table 
(
    customer_id 
,g01 
,g02 
,g03 
,has_card 
,activity 
) 
    SELECT sgd.customer_id, sgd.g01,sgd.g02,sgd.g03,sc.value, a.activity 
    FROM s_geo_data sgd 
    LEFT JOIN s_category sc 
    ON sc.customer_id = sgd.customer_id 
    UNION 
    SELECT sgd.customer_id, sgd.g01,sgd.g02,sgd.g03,sc.value, a.activity 
    FROM s_geo_data sgd 
    RIGHT JOIN s_category sc 
    ON sc.customer_id = sgd.customer_id 

    UNION 

    SELECT sgd.customer_id, sgd.g01,sgd.g02,sgd.g03,sc.value, a.activity 
    FROM s_geo_data sgd 
    LEFT JOIN s_activity a 
    ON a.customer_id = sgd.customer_id 
    UNION 
    SELECT sgd.customer_id, sgd.g01,sgd.g02,sgd.g03,sc.value, a.activity 
    FROM s_geo_data sgd 
    RIGHT JOIN s_activity a 
    ON a.customer_id = sgd.customer_id 

而且我想這個查詢:

INSERT INTO reportls.table 
(
    customer_id 
,g01 
,g02 
,g03 
,has_card 
,activity 
) 
    SELECT sgd.customer_id, sgd.g01,sgd.g02,sgd.g03,sc.value, a.activity 
    FROM s_geo_data sgd 
    LEFT JOIN s_category sc 
    ON sc.customer_id = sgd.customer_id 
    LEFT JOIN s_activity a 
    ON sc.customer_id = sgd.customer_id 

    UNION 

    SELECT sgd.customer_id, sgd.g01,sgd.g02,sgd.g03,sc.value, a.activity 
    FROM s_geo_data sgd 
    LEFT JOIN s_category sc 
    ON sc.customer_id = sgd.customer_id 
    RIGHT JOIN s_activity a 
    ON a.customer_id = sgd.customer_id 

    UNION 

    SELECT sgd.customer_id, sgd.g01,sgd.g02,sgd.g03,sc.value, a.activity 
    FROM s_geo_data sgd 
    RIGHT JOIN s_category sc 
    ON sc.customer_id = sgd.customer_id 
    LEFT JOIN s_activity a 
    ON a.customer_id = sgd.customer_id 

末查詢執行很長一段時間,我需要更快的查詢。

回答

2

我覺得有一個FULL OUTER JOIN超過3個表,你需要做的是這樣的:

SELECT t1.value, t2.value, t3.value 
FROM t1 LEFT JOIN t2 ON t1.value = t2.value 
     LEFT JOIN t3 ON t1.value = t3.value 
UNION ALL 
SELECT t1.value, t2.value, t3.value 
FROM t2 LEFT JOIN t1 ON t1.value = t2.value 
     LEFT JOIN t3 ON t2.value = t3.value 
WHERE t1.value IS NULL 
UNION ALL 
SELECT t1.value, t2.value, t3.value 
FROM t3 LEFT JOIN t1 ON t1.value = t3.value 
     LEFT JOIN t2 ON t2.value = t3.value 
WHERE t1.value IS NULL AND t2.value IS NULL 

至於這個替代:

SELECT t1.value, t2.value, t3.value 
FROM t1 FULL OUTER JOIN t2 ON t1.value = t2.value 
     FULL OUTER JOIN t3 ON t1.value = t3.value 

我建議你創建一些臨時表,如t1t2t3用於存儲您的查詢結果,然後使用上述查詢。

+0

我執行您的查詢,等待超過20分鐘,並按下取消。 )) –

+0

@ШыназАлиш20分鐘真的很高,但我想不出任何更好的查詢;)。 –

+0

@謝謝你的回覆! –