SQLite中Chinook数据库添加未使用表后查询结果异常的原因咨询
问题原因解析:隐式交叉连接(笛卡尔积)导致的统计异常
嘿,这个问题其实是SQL里很常见的*笛卡尔积(Cartesian Product)*陷阱,咱们一步步把它说清楚:
1. 初始查询的正常逻辑
你的第一个查询:
select i.customerid, count(i.invoiceid) from invoices as i group by i.customerid
逻辑非常清晰:按CustomerId分组,统计每个客户对应的发票数量。数据库会遍历invoices表,把同一个客户的所有发票归为一组,每组的计数就是该客户的实际发票数(这里是7),完全符合预期。
2. 第二个查询的隐式交叉连接坑
当你在FROM子句里写invoices as i, customers as c时,这在SQL里属于隐式交叉连接——数据库会把invoices表的每一行,和customers表的每一行进行无差别配对组合。
你的数据库里刚好有59个客户,那么原本每个客户的7条发票,每条都会和这59个客户记录逐一配对。最终,每个i.customerid对应的总行数就变成了7 × 59 = 413。而count(i.invoiceid)统计的是分组后的总行数,所以结果自然就变成了413。
简单说,你没有指定两个表之间的关联条件(比如i.customerid = c.customerid),数据库就默认把两个表做了全量配对,这才让统计结果被硬生生放大了59倍。
3. 如果你确实需要关联customers表
如果你的后续查询需要用到customers表的数据,一定要显式添加连接条件,比如用内连接:
select i.customerid, count(i.invoiceid) from invoices as i inner join customers as c on i.customerid = c.customerid group by i.customerid
这样连接后,每个发票只会和对应的客户记录配对,不会产生多余的行,统计结果就会和初始查询完全一致。
内容的提问来源于stack exchange,提问作者acromarco
相关产品推荐
相关产品推荐

