SQL问题:筛选仅出现一次的表记录,现有查询不生效求助
解决筛选仅出现一次记录的SQL问题
原查询的问题
你写的SQL报错大概率是因为table是SQL的保留关键字,直接用它当表名会触发语法错误,另外还有一些可以优化的点。
修正后的两种可行写法
写法1:修正原查询的表名问题
把表名用反引号(MySQL)或方括号(SQL Server)括起来,同时简化计数逻辑:
select item_id, barcode, qty from `table` -- MySQL用反引号,SQL Server换成[table] where barcode NOT IN ( SELECT barcode FROM `table` GROUP BY barcode HAVING COUNT(*) > 1 )
如果你的实际表名不是table,直接把table替换成真实表名即可。
写法2:用窗口函数(更高效,兼容NULL场景)
如果你的数据库支持窗口函数(比如MySQL 8+、PostgreSQL、SQL Server等),推荐用这种写法,一次扫描表就能完成统计,还能正确处理barcode为NULL的情况(原写法会漏掉NULL且仅出现一次的记录):
select item_id, barcode, qty from ( select item_id, barcode, qty, COUNT(*) OVER (PARTITION BY barcode) as barcode_count from `table` -- 同样替换成实际表名 ) temp where barcode_count = 1
补充说明
- 如果
barcode字段存在NULL值,第一种写法的NOT IN会因为NULL的特性(NULL和任何值比较都是UNKNOWN)导致NULL的记录被排除,而第二种写法可以正常筛选出仅出现一次的NULL记录。 - 优先用窗口函数的写法,性能比子查询更优,尤其是数据量较大的时候。
内容的提问来源于stack exchange,提问作者PHP beginner
相关产品推荐
相关产品推荐

