2013-05-14 55 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