# JOIN-01：可丢弃的 SQLite 计数练习

把以下文件放在同一目录：`schema-seed.sql`、`wrong.sql`、`diagnostic.sql`、`correct.sql`、`expected.json` 和 `run_example.py`。使用包含标准库 `sqlite3` 模块的本地 Python 3，无需安装软件包、运行 SQL 服务或创建数据库文件。

在该目录中运行：

```sh
python3 run_example.py baseline
python3 run_example.py add_c7
python3 run_example.py remove_c5_c6
python3 run_example.py empty_checks
```

每条命令都会新建一个内存数据库，加载完整表结构和原始初始数据，只应用当前场景声明的改动，然后运行三个查询。它会打印完整结果行、列、实际 Python/SQLite 版本及数据改动。退出0表示三份结果集都与手工预期一致；退出1表示比较失败。Python 或 SQL 异常也会使命令失败，并打印诊断。

`wrong.matches_hand_expected=true` 表示已知的错误计数行为被重现，不表示错误查询回答了任务。正确查询必须符合另外指定的对象计数。

四份 `observed/*.json` 是作者已记录的运行结果，不是你自己电脑的输出。`execution.json` 是内部执行记录，保留命令、退出码和 UTC 观察时间；它仅供内部保存，不包含在读者下载文件中，也不应为补齐这处文字提及而公开整个审计目录。作者测试使用 Python 3.9.6 和 SQLite 3.51.0。命令会打印你的实际版本；应重跑并检查比较结果，不要假定自己的环境也是这个版本。

`expected.json` 由手工推导，在执行前保存。基准来自对四个项目实体和六个独立检查 ID 的计数。三个改动分别使用新的初始数据，互不累加。运行器从不重写原始输入。

完整中文教程见 [article.zh-CN.md](/zh/blog/check-ai-sql-query-joined-rows/)。[complete-repair-request.zh-CN.txt](/blog/assets/check-ai-sql-query-joined-rows/zh-CN/complete-repair-request.zh-CN.txt)包含完整任务、表结构与初始数据、错误 SQL、实际观察到的完整错误结果和人工错误解释。[corrected-answer.zh-CN.txt](/blog/assets/check-ai-sql-query-joined-rows/zh-CN/corrected-answer.zh-CN.txt)与共享的 `correct.sql` 是完整示范答案，与修复输入分开。

全部数据及错误解释都是原创虚构材料。运行这个练习不等于测试了模型、上传了记录或访问了私有服务，也不能证明任何大型数据库或具有不同数据关系的数据库的查询结果正确。
