SQL Server临时表SELECT语句不识别列名 如何调整语法正常运行
SQL语句修正方案
现有代码错误清单
- 语法函数不兼容:SQL Server 不支持
SELECT子句直接使用IF()做逻辑判断,需替换为IIF()(2012及以上版本支持)或通用的CASE WHEN语法 - 聚合函数规则不满足:使用
MAX(Score)聚合函数时,未对非聚合列FirstPlayer、SecondPlayer配置GROUP BY分组规则,不符合SQL语法规范 - 引用不存在字段:
WHERE条件中的Points列未在临时表#GameScores中定义,对应分数字段应为Score - 字符串引号使用错误:SQL Server 字符串常量需用单引号包裹,原代码中
"JO%"的双引号会被识别为对象标识符,导致匹配逻辑失效 - 智能感知缓存问题:语法修正后如果Azure Data Studio仍显示列名红色下划线,按快捷键
Ctrl+Shift+R刷新智能感知缓存即可消除
修正后可运行代码(按「保留每行记录,对同玩家组合的最高得分额外加20」的常见需求实现)
IF OBJECT_ID('tempdb.dbo.#GameScores','U') IS NOT NULL DROP TABLE #GameScores; GO CREATE TABLE #GameScores ( FirstPlayer VARCHAR(10), SecondPlayer VARCHAR(10), Score INTEGER ); GO INSERT INTO #GameScores VALUES ('Joe','Ryan', 120), ('Sue', 'Jackie', 200), ('Ryan', 'Sue', 50), ('Ryan', 'Joe', 100); GO SELECT DISTINCT FirstPlayer, SecondPlayer, CASE WHEN Score = MAX(Score) OVER (PARTITION BY FirstPlayer, SecondPlayer) THEN MAX(Score) OVER (PARTITION BY FirstPlayer, SecondPlayer) + 20 ELSE Score END AS Score FROM #GameScores WHERE SecondPlayer NOT LIKE 'JO%' OR Score <> 100
如果需要按玩家组合聚合仅返回单条统计结果,可将窗口函数替换为GROUP BY FirstPlayer, SecondPlayer搭配聚合函数实现。
内容的提问来源于stack exchange,提问作者Tony Correia
相关产品推荐
相关产品推荐

