统计多作品导演时CAST转换报错:Varchar值'Co_op'转Int失败
问题分析与修正
首先明确:报错不是CAST函数执行失败,问题出在你的WHERE子句里:
你写的WHERE 'Co_op' > 1中,'Co_op'是带单引号的字符串字面量,数据库会试图把这个字符串转换成整数来和1比较,自然触发类型转换错误。而且SQL的执行顺序是先执行WHERE过滤,再执行SELECT生成别名,所以哪怕你去掉单引号,WHERE Co_op > 1也会报错——此时Co_op这个别名还没被定义。
另外你的查询逻辑本身偏离了「统计执导超过一部电影的导演数量」的目标,原查询会因为关联电影表返回重复行,且子查询的写法冗余。
正确的查询写法
要实现你的需求,应该先按导演分组统计电影数量,再筛选出数量>1的导演,最后统计这些导演的总数:
写法1(关联导演表确保有效性)
SELECT COUNT(*) AS 执导超一部电影的导演数 FROM ( SELECT dir.dir_id FROM [DBAmovies].[dbo].directors dir JOIN [DBAmovies].[dbo].moviedir movdir ON dir.dir_id = movdir.dir_id GROUP BY dir.dir_id HAVING COUNT(movdir.title_id) > 1 ) AS 符合条件的导演
写法2(如果moviedir中的dir_id均为有效导演)
如果moviedir表的dir_id都能在directors表中找到,也可以直接从关联表统计,更简洁:
SELECT COUNT(DISTINCT dir_id) AS 执导超一部电影的导演数 FROM [DBAmovies].[dbo].moviedir GROUP BY dir_id HAVING COUNT(title_id) > 1
原查询的其他问题
Dir.title_id是错误的:directors表应该不存在title_id字段,你可能想写Mov.title_id,但这会导致一个导演对应多部电影时返回多行,不符合「统计导演数量」的需求。- 子查询
SELECT COUNT(dir.dir_id)冗余:可以直接用COUNT(*),只要dir_id不为空,结果完全一致,且执行效率更高。
内容的提问来源于stack exchange,提问作者user616076
相关产品推荐
相关产品推荐

