2013-05-14 87 views
0

我有3个表如何结合三个表导致一个SQL查询

TABLE "TUTOR" 
TUTOR_ID NMAE 
--------------- 
1   N1 
2   N2 
3   N3 
4   N4 

TABLE "TUTOR_SETTING" 
TUTOR_ID MAX_STU_NUM 
---------------------- 
1   5 
2   6 

TABLE "STU_TUTOR_MAPPING" 
---------------------- 
STU_ID TUTOR_ID 
A   1 
B   2 
C   1 
D   1 

,我想combile低于3 SQL到一个SQL:

1. SELECT * FROM TUTOR t1 
2. SELECT * FROM TUTOR_SETTING t2 where t2.TUTOR_ID=t1.TUTOR_ID 
3. SELECT COUNT(t3.STU_ID) FROM STU_TUTOR_MAPPING t3 WHERE t3.TUTOR_ID=t1.TUTOR_ID GROUP BY T1.TUTOR_ID 

和预期的结果: 选择所有从表“TUTOR”和JOIN“TUTOR_SETTING”中加入“STU_TURTOR_MAPPING”,并在具有相同tutor_id时对“STU_TUTOR_MAPPING”的行进行计数。

TUTOR_ID NAME  MAX_STU_NUM TOTAL_STU_NUM 
------------------------------------------------- 
1   N1  5    3 
2   N2  6    1 
3   N3  null 
4   N4  null 

我试着这样说:

SELECT t1.TUTOR_ID, t1.NAME, t2.MAX_STU_NUM, count(t3.STU_ID) 
FROM TUTOR t1 
    LEFT JOIN TUTOR_SETTING t2 on (t1.TUTOR_ID=t2.TUTOR_ID) 
    LEFT JOIN stu_tutor_mapping t3 on (t1.TUTOR_ID=t3.TUTOR_ID) 
GROUP BY t1.TUTOR_ID, t1.NAME; 

但数据库报告错误:

ORA-00979: not a GROUP BY expression 
00979. 00000 - "not a GROUP BY expression" 
*Cause:  
*Action: 
Error at Line: 1 Column: 30 

最后,我决心通过谷歌这个问题,这里是SQL语句:

SELECT t1.TUTOR_ID, t1.NAME, t2.MAX_STU_NUM, t3.stu_allocated 
FROM TUTOR t1 
    LEFT JOIN TUTOR_SETTING t2 on (t1.TUTOR_ID=t2.TUTOR_ID) 
    LEFT JOIN 
    (select tutor_id ,count(*) as TOTAL_STU_NUM from stu_turtor_mapping group by 
    tutor_id) t3 on t3.TUTOR_ID=t1.TUTOR_ID 
+0

哪个RDBMS?你想要的输出是什么?你有什么尝试? – hims056 2013-05-14 07:00:13

+1

你想加入这个表或者你怎么能指望从这个 – 2013-05-14 07:00:33

+0

这是ORACLE Express数据库造成的,我想查询表“家教”,并加入“TUTOR_SETTING”,并加入“STU_TURTOR_MAPPING”,也算“STU_TUTOR_MAPPING”的行时有相同的tutor_id。 – sureone 2013-05-14 07:09:30

回答

3
SELECT a.Tutor_ID, 
     a.Name, 
     COUNT(b.TUTOR_ID) TotalCount 
FROM Tutor a 
     LEFT JOIN STU_TUTOR_MAPPING b 
      ON a.Tutor_ID = b.TUTOR_ID 
GROUP BY a.Tutor_ID, a.Name 

为了进一步获得更多的知识有关加入,请访问以下链接:

上面的查询将显示所有记录从表TUTOR是否有对其他表中没有匹配记录并且将显示0作为自使用LEFT JOIN以来的总计数。如果要列出其他表格上至少有1个匹配记录的所有记录,则INNER JOIN就足够了。

SELECT a.Tutor_ID, 
     a.Name, 
     COUNT(*) TotalCount 
FROM Tutor a 
     INNER JOIN STU_TUTOR_MAPPING b 
      ON a.Tutor_ID = b.TUTOR_ID 
GROUP BY a.Tutor_ID, a.Name 
+0

感谢JW,我想结合3个表,意味着应该有两个LEFT JOINS一个是连接表“TUTOR_SETTING”,另一个加盟TBALE“STU_TUTOR_MAPPING”蚁它的rows – sureone 2013-05-14 07:07:12

+0

可你与你期望的结果更新你的问题? ':)' – 2013-05-14 07:11:11

0

它的如此简单的使用加入您的查询。 如果你不知道有关JOIN然后Link 1.Link 2

+0

如果参考文献不是针对互联网最糟糕的参考网站之一w3schools,我会给出这个+1。 – 2013-05-14 07:07:02

+0

@JanHudec你是对的,但它的主要。所以我只是分享了这个参考。 – 2013-05-14 07:09:15

0

你可以做到这样 -

SELECT t1.TUTOR_ID, t1.NAME, t2.MAX_STU_NUM, count(t3.stu_id) 
FROM TUTOR t1 
    LEFT JOIN TUTOR_SETTING t2 on (t1.TUTOR_ID=t2.TUTOR_ID) 
    LEFT JOIN STU_TUTOR_MAPPING t3 on (t1.TUTOR_ID=t3.TUTOR_ID) 
GROUP BY t1.TUTOR_ID, t1.NAME, t2.MAX_STU_NUM 
+0

我试过,但它报告一个错误:ORA-00979:不是GROUP BY表达式 00979. 00000 - “不是一个GROUP BY表达式” *原因: *动作: 行错误:1列:30 – sureone 2013-05-14 07:25:36

+0

请参阅我更新的答案...我已经改变了查询使用'count(t3.stu_id)' – Kshitij 2013-05-14 08:07:58