使用CAST将Varchar转换为Int时的获取和错误

问题描述 投票:0回答:1

我正在编写一个查询来计算出拍摄过多部电影的电影导演的数量。我已经获取了子查询的值,但是当我运行它时,出现错误“将 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
失败了?

sql casting subquery
1个回答
0
投票

正确的引用使用

[]
而不是
''
,并且在任何情况下下划线
_
都不需要引用。

其他问题:

  • 除非您使用区分大小写的服务器,否则
    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;
© www.soinside.com 2019 - 2024. All rights reserved.