求助:基于子查询多值结果过滤SQL表行的实现问题
问题排查与解决方案
你的SQL查询失效的核心原因是**IN是SQL的保留关键字**,但你将它用作了表名(Table IN)和列名(GENERAL.IN),直接引用会导致数据库解析时出现语法错误,无法正确执行查询。
修正方案
针对不同数据库,需要用特定符号包裹关键字类型的标识符,以下是主流数据库的写法:
1. MySQL/MariaDB 写法
使用反引号 ` 包裹关键字:
SELECT * FROM GENERAL WHERE `GENERAL`.`IN` IN ( SELECT `IN`.`ID` FROM `IN` WHERE `IN`.`TYPE` = 1 )
2. SQL Server 写法
使用方括号 [] 包裹关键字:
SELECT * FROM GENERAL WHERE [GENERAL].[IN] IN ( SELECT [IN].[ID] FROM [IN] WHERE [IN].[TYPE] = 1 )
3. Oracle 写法
使用双引号 "" 包裹关键字(注意Oracle对大小写敏感,若表/列创建时为大写,双引号内需保持大写):
SELECT * FROM GENERAL WHERE "GENERAL"."IN" IN ( SELECT "IN"."ID" FROM "IN" WHERE "IN"."TYPE" = 1 )
优化写法(更易读)
给表添加别名,避免重复引用关键字,提升代码可读性:
-- 以MySQL为例,其他数据库只需替换包裹符号即可 SELECT g.* FROM GENERAL g WHERE g.`IN` IN ( SELECT i.ID FROM `IN` i WHERE i.TYPE = 1 )
修改后执行查询,就能得到你期望的结果:
ID IN OUT 1 2 3 4 5 6 8 2 4 9 2 4
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

