2013-06-01 34 views
1

這裏以不同的名字出現兩種常見的列是兩個表中各表的例子:加入基於各表中的

客戶

╔══════════╦════════════╗ 
║ GROUP_ID ║ GROUP_NAME ║ 
╠══════════╬════════════╣ 
║ abc  ║ xex  ║ 
║ def  ║ tet  ║ 
╚══════════╩════════════╝ 

╔════════╦════════════╗ 
║ ACT_ID ║ GROUP_NAME ║ 
╠════════╬════════════╣ 
║  44 ║ xex  ║ 
║  32 ║ tet  ║ 
╚════════╩════════════╝ 

動作

╔════╦════════════╗ 
║ ID ║ STATE ║ 
╠════╬════════════╣ 
║ 44 ║ complete ║ 
║ 58 ║ incomplete ║ 
╚════╩════════════╝ 

注意act_idteams也存在於表actions作爲id

我要選擇有兩列的表:group_idgroup_name,其中每個group_name具有帶有完整act_idstate

我做這樣的事情:

SELECT group_id AND group_name 
FROM clients 
WHERE group_name IN (SELECT group_name 
        FROM teams, actions 
        WHERE teams.act_id = actions.id 
         AND actions.state IS complete) 

這是正確的?

我也想到了什麼樣

SELECT group_id AND group_name 
FROM clients 
WHERE group_name IN (SELECT group_name 
        FROM teams 
        WHERE act_id IN (SELECT id 
             FROM actions 
             WHERE teams.act_id = actions.id. 
             AND state IS complete)) 

或者是上述的正確嗎?

我希望得到的表顯然是這一個:

╔══════════╦════════════╗ 
║ GROUP_ID ║ GROUP_NAME ║ 
╠══════════╬════════════╣ 
║ abc  ║ xex  ║ 
╚══════════╩════════════╝ 

回答

3
SELECT a.* 
FROM clients a 
     INNER JOIN teams b 
      ON a.group_name = b.group_name 
     INNER JOIN actions c 
      ON b.act_ID = c.id 
WHERE c.state = 'complete' 

你的SQL查詢看到星號*意味着它將選擇所有列都可用,在這種情況下,它將全部從表clients中選擇。如果您只想選擇特定列,請使用comma來區分不是AND。例如,

SELECT a.GROUP_ID, a.GROUP_NAME 
FROM clients a 
     INNER JOIN teams b 
      ON a.group_name = b.group_name 
     INNER JOIN actions c 
      ON b.act_ID = c.id 
WHERE c.state = 'complete' 

爲了進一步獲得更多的知識有關加入,請訪問以下鏈接:

+0

非常感謝你回答JW。您正在使用的a,b和c只是您分配給每個表的隨機名稱,以便您可以輕鬆識別它們並在查詢中區分它們。你也可以給我上面的查詢使用我自己更詳細的格式(沒有JOINS只是通過使用WHERE,IN,IS,IS NOT,=),以便我可以更好地理解你在做什麼?或者沒有JOIN,這是不可能的?再次感謝,我一定會看JOINs。 –

+0

'a,b,c'被稱爲'ALIAS'(*或暱稱*)。有很多可能的查詢來達到特定的結果。我最喜歡的是使用'JOIN'。這也可以使用'EXISTS'完成。 ')' –