【问题标题】:MYSQL with SELECT clause with three different tables带有三个不同表的 SELECT 子句的 MYSQL
【发布时间】:2014-04-27 10:21:19
【问题描述】:

拥有这 3 张桌子

第一个,员工

//Employee
E#     ENAME         D#
-----------------------
1      ALI           1
2      SITI          2
3      JOHN          2
4      MARY          3
5      CHIRS         3

第二,项目

//PROJECT
P#     PNAME        D#
-----------------------
1     Computing     1
2     Coding        3
3     Researching   3

第三,WORKSON

//WORKSON
E#     P#     Hours
--------------------
1      1       3
1      2       5
4      3       6

所以我的输出应该是这样的

E#       ENAME      D#       TOTAL HOURS/W
--------------------------------------------
1         ALI       1              8
2        SITI       2              0
3        JOHN       2              0
4         MAY       3              6
5        CHIRS      3              0

显示 0,因为该员工没有要处理的项目。

我目前使用的声明

SELECT E.E#,E.NAME,E.D#,NVL(sum(Hours),0) AS "TOTAL HOURS/W"
    FROM Employee E,WORKSON W WHERE E.E#=W.E# OR 
GROUP BY E.E#,E.NAME,E.D#;

不知道它应该如何选择然后将显示所有员工,而不仅仅是特定的 E#。 输出显示好像员工没有任何项目工作,它应该显示为 0 值

【问题讨论】:

  • 考虑提供适当的 DDL(和/或 sqlfiddle)以及所需的结果集
  • 您使用的是 Oracle 还是 MySQL?请用适当的数据库标记问题。

标签: mysql sql oracle


【解决方案1】:

这可以通过仅将员工和 WORKSON 加入

select
e.`E#`,
e.ENAME,
e.`D#`,
coalesce(tot,0) as `TOTAL HOURS/W`
from Employee e
left join
(
  select `E#`,
  sum(Hours) as tot
  from WORKSON
  group by `E#`
)w
on w.`E#` = e.`E#`
group by e.`E#`

DEMO

【讨论】:

  • 我可以不想使用 coalesce 吗?有别的选择吗?因为我不清楚使用它
【解决方案2】:

您应该使用left outer join。以下应该在 MySQL 和 Oracle 中都可以工作:

SELECT E.E#, E.NAME, E.D#,
       COALESCE(SUM(Hours), 0) AS "TOTAL HOURS/W"
FROM Employee E LEFT OUTER JOIN
     WORKSON W 
     ON E.E# = W.E# 
GROUP BY E.E#, E.NAME, E.D#;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多