【问题标题】:How to combine three tables result by one SQL query如何通过一个 SQL 查询组合三个表结果
【发布时间】:2013-05-14 06:58:02
【问题描述】:

我有 3 张桌子

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

我想将以下 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”中选择所有并加入“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

最后我通过google解决了这个问题,下面是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

【问题讨论】:

  • 哪个 RDBMS?你想要的输出是什么?你试过什么?
  • 你想加入这个表格或者你期望这个结果如何
  • 这是ORACLE express数据库,我想查询表“TUTOR”和JOIN“TUTOR_SETTING”并加入“STU_TURTOR_MAPPING”,当有相同的tutor_id时还要计算“STU_TUTOR_MAPPING”的行数。

标签: sql


【解决方案1】:
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

【讨论】:

  • 谢谢 JW,我想合并 3 个表,意味着应该有两个 LEFT JOINS 一个是 JOIN TABLE "TUTOR_SETTING" 另一个是 JOIN TBALE "STU_TUTOR_MAPPING" ant 它是 ROWS
【解决方案2】:

在查询中使用 Join 非常简单。 如果您不了解 JOIN,那么 Link 1.,Link 2

【讨论】:

  • 如果不是参考 w3schools(互联网上最糟糕的参考网站之一),我会给出 +1。
  • @JanHudec 你是对的。但它非常重要。所以我只是分享了这个参考。
【解决方案3】:

你可以这样做-

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

【讨论】:

  • 我试过了但是报错:ORA-00979: not a GROUP BY expression 00979. 00000 - "not a GROUP BY expression" *原因:*操作:错误在行:1 列:30
  • 请查看我的更新答案...我已将查询更改为使用count(t3.stu_id)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多