2013-06-01 13 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'完成。 ')' –