我正在编写一个查询来计算出拍摄过多部电影的电影导演的数量。我已经获取了子查询的值,但是当我运行它时,出现错误“将 varchar 值 'Co_op' 转换为数据类型 int 时转换失败”。
SELECT
Dir.title_id,
CAST((SELECT COUNT(dir.dir_id)
FROM [DBAmovies].[dbo].moviedir dir
WHERE Dir.dir_id = dir.dir_id) AS int) AS 'Co_op'
FROM
[DBAmovies].[dbo].[directors] Dir
JOIN
[DBAmovies].[dbo].moviedir MovDir ON MovDir.dir_id = Dir.dir_id
JOIN
[DBAmovies].[dbo].movies Mov ON MovDir.title_id = Mov.title_id
WHERE
'Co_op' > 1
为什么我的
CAST
失败了?
正确的引用使用
[]
而不是 ''
,并且在任何情况下下划线 _
都不需要引用。
其他问题:
Dir
和 dir
是同一件事,因此子查询无论如何都不会正确。SELECT
中使用 WHERE
中的列。它需要在子查询中。SELECT
Dir.*
FROM (
SELECT
Dir.title_id,
COUNT(*) OVER (PARTITION BY Dir.dir_id) AS Co_op
FROM
dbo.directors Dir
JOIN
dbo.moviedir MovDir ON MovDir.dir_id = Dir.dir_id
JOIN
dbo.movies Mov ON MovDir.title_id = Mov.title_id
) Dir
WHERE
Co_op > 1;
话虽如此,我怀疑你可能只是想要正常的聚合。
SELECT
Dir.dir_id,
COUNT(*) AS Co_op
FROM
dbo.directors Dir
JOIN
dbo.moviedir MovDir ON MovDir.dir_id = Dir.dir_id
JOIN
dbo.movies Mov ON MovDir.title_id = Mov.title_id
GROUP BY
Dir.dir_id
HAVING
COUNT(*) > 1;
或者作为连接聚合
SELECT
Dir.dir_id,
md.Co_op
FROM
dbo.directors Dir
JOIN (
SELECT
MovDir.dir_id,
COUNT(*) AS Co_op
FROM
dbo.moviedir MovDir
JOIN
dbo.movies Mov ON MovDir.title_id = Mov.title_id
GROUP BY
MovDir.dir_id
) md ON md.dir_id = Dir.dir_id
WHERE
md.Co_op > 1;