我遇到了一个问题,这让我有点疯狂。我有以下代码:
SELECT COUNT(DISTINCT f.f_id) AS `The Good`,
COUNT(DISTINCT s.f_id) AS `The Bad`,
COUNT(DISTINCT x) AS `The Ugly"`
FROM faculty f, student s, (
SELECT f_id AS x
FROM faculty
MINUS (
SELECT f.f_id
FROM faculty f, course_section cs
WHERE f.f_id = cs.f_id
UNION
SELECT f_id
FROM student
)
);
我想从f_id
表中的教师表f_id
计算student
的计数,然后计算f_id
的计数来自学生表和faculty
表的MINUS
表f_id
course_section
。
如果我的上一个COUNT
返回的数字不是0
,那么一切都很顺利。但是,如果它返回0
,它也会将我的前两个计数更改为0
。前两个COUNT
应分别为6
和4
。
我一直试图弄清楚如何解决这个问题几个小时,但我没有运气。
显然必定会有一些我遗漏的东西。我的代码出了什么问题?
感谢。
答案 0 :(得分:1)
您正在为联接TableA, TableB, TableC
使用ANSI-ANCIENT表示法。
但是你没有WHERE子句。这是所有表格与每个可能的行组合(一个完整的cartessian产品)。这是一个坏主意。
此外,您的结果实际上并不需要将任何表连接在一起。我建议只在SELECT子句中使用子查询...
SELECT
(select count(distinct f_id) from faculty) "The Good",
(select count(distinct f_id) from student) "The Bad",
(
select
count(distinct f_id)
from
(
select f_id from faculty
MINUS
select f.f_id from faculty f INNER JOIN course_section cs ON f.f_id = cs.f_id
MINUS
select f_id from student
)
) "The Ugly"
;
-- Add FROM DUAL is this is Oracle.