在 as 语句中 IS NOT NULL
Posted
技术标签:
【中文标题】在 as 语句中 IS NOT NULL【英文标题】:IS NOT NULL on as statement 【发布时间】:2014-05-29 12:21:07 【问题描述】:我有两个表,分别称为“教师”和“课程”。表'teachers'有四列,即teacher_id、teacher_name、teacher_work_hours和course_id。表“课程”有两列,即 course_id 和 course_name。我想从表'teacher'中选择两列,并计算表'courses'中teacher.course_id = course.course_id的实例数。查询应丢弃表 course 的 count() 为零的行,即 count() 为零的行不应显示在结果集中。我怎么做? 我有这个问题。
select t.teacher_name, t.teacher_work_hours, (select count(*)
from course where course_id = t.course_id
having count(*) > 0) as COURSES
from teacher t
where teacher_work_hours > 5
AND COURSES IS NOT NULL
查询不正确,因为它不允许我将 IS NOT NULL 运算符放在 COURSES 上。
【问题讨论】:
ROLES IS NOT NULL
在这里有什么意义?
xyz 表中可用的字段有哪些?没有条件......它总是有相同的计数......
最好给出示例数据和期望的结果,而不是显示您损坏的查询和糟糕的解释。不太清楚你想用这种方法做什么。
除了显示您损坏的查询*
您不能在WHERE
子句中使用列别名。唯一允许使用列别名的子句是ORDER BY
。
【参考方案1】:
ROLES
是一个表而不是一个列,无论如何它只出现在子查询中。这不是更有意义吗? (这仍然行不通,因为您不能在 WHERE
子句中使用别名,但它更接近于有意义。)
SELECT name, class, (SELECT COUNT(*)
FROM xyz
-- HAVING COUNT(*) > 0
-- Doesn't make sense without a GROUP BY
) AS ROLES
FROM abc
WHERE class > 5
AND ROLES IS NOT NULL
不过,我认为这不是您真正想要做的,因为子查询不依赖于abc
的当前行。您可能需要更改查询以使用联接和 GROUP BY
而不是子查询。
【讨论】:
首先,不能在 WHERE 子句中使用列别名。第二次使用没有 group by 并检查ROLES IS NOT NULL
没有意义
虽然仅供参考,但我没有投反对票,但ROLES
将返回计数(没有任何分组的总计数)。我不明白,在这里检查roles is not null
会有什么好处。
不能在Where子句中使用列别名,所有查询都是废话,因为count和主表abc没有关联...
@MS:这不是一个“答案”,因为它不是一个有效的解决方案。答案不包含有效的解决方案;答案通常不需要这样做。提供的 SQL 代码旨在建议一种方法,尽管它有缺陷,但更接近于正确的路线。真正的解决方案是遵循建议并重构查询以使用联接和分组依据。
@Justin,我不确定您的评论应该添加什么,因为这些都是在答案本身中评论的内容。【参考方案2】:
查询不清楚。但我只是想分享以下查询供您参考。请检查查询是否有用...
SELECT class, ROLES.Total
FROM abc
CROSS APPLY
(SELECT COUNT(*) AS Total FROM xyz WHERE abc.class = xyz.class) ROLES
WHERE class > 5
【讨论】:
以上是关于在 as 语句中 IS NOT NULL的主要内容,如果未能解决你的问题,请参考以下文章