You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:32:41