如果特定计数返回0,则SQL中的特定计数将所有其他计数更改为0

时间:2011-10-14 15:56:45

标签: sql

我遇到了一个问题,这让我有点疯狂。我有以下代码:

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表的MINUSf_id course_section

如果我的上一个COUNT返回的数字不是0,那么一切都很顺利。但是,如果它返回0,它也会将我的前两个计数更改为0。前两个COUNT应分别为64

我一直试图弄清楚如何解决这个问题几个小时,但我没有运气。

显然必定会有一些我遗漏的东西。我的代码出了什么问题?

感谢。

1 个答案:

答案 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.