2014-11-25 112 views
0

我需要將3個表連接到一個表。這是場景。如何將3個表連接到SQL中的單個表中

表1:已user_id說明,APP_ID

表2:已user_id說明,性別

表3:已APP_ID,APP_NAME(PC,移動電話)

表4:已user_id說明,user_city

現在我正在尋找通過移動男性,移動女性,PC男性,PC女性按城市分組的用戶數。

這是我的SQL。但是,我想我對聯接做錯了。請糾正我。

SELECT 
    t4.user_city, 
    sum(case when t2.gender = 'm' and t3.app_name = 'PC' then 1 else 0 end) pcmale, 
    sum(case when t2.gender = 'f' and t3.app_name = 'PC' then 1 else 0 end) pcfemale, 
    sum(case when t2.gender = 'm' and t3.app_name = 'Mobile' then 1 else 0 end) mobilemale, 
    sum(case when t2.gender = 'm' and t3.app_name = 'Mobile' then 1 else 0 end) mobilefemale, 
FROM 
    table1 t1 
    inner join 
    table2 t2 on t1.user_id = t2.user_id 
    inner join 
    table3 t3 on t1.app_id = t3.app_id 
    inner join 
    table4 t4 on t1.user_id = t4.user_id 
GROUP BY 1 

我們可以按照我在查詢中完成的方式將多個表連接到單個表中。請幫忙

+0

它運行。我只是不確定我是否正確地做出了正確的結果。您是否發現將多個表連接到t1表的任何問題? – 2014-11-25 01:18:22

+0

移動女性應該檢查f,你正在檢查m和組應該在t4.user_city – radar 2014-11-25 01:25:17

+0

那麼你會得到什麼結果? – DeanOC 2014-11-25 01:43:00

回答

0

是的。你的加入是正確的,如書面。

如果T1中有一個T2,T3或T4中不存在的值,它將被排除在結果之外。這是因爲你寫的JOININTERSECTION。例如,如果T1中的某一行的值爲app_id = '99',並且T2的app_id的值不是相應的值「99」,則它將不會在您編寫的SQL中返回。

在這些情況下,如果您想要返回T1中包含'u'的行,您需要編寫一個'LEFT OUTER JOIN',它將返回LEFT表中的所有記錄以及RIGHT表中匹配的記錄。例如,對於app_id,T1的值爲'99',您將在T3中獲得app_name的NULL值。

這是查詢中JOIN邏輯的過於簡化的例子,但它有希望有幫助。