sql - FROM 更改检索数据后添加未使用的表
问题描述
我指的是我用来学习 SQLite的Chinook 数据库。此查询检索每个 CustomerId 的发票数量,如我所愿:
select i.customerid, count(i.invoiceid)
from invoices as i
group by i.customerid
返回:
+------------+--------------------+
| CustomerId | count(i.invoiceid) |
+------------+--------------------+
| 1 | 7 |
| 2 | 7 |
| 3 | 7 |
...
但是当我构建一个更复杂的查询时,我观察到一些我无法解释的事情:
select i.customerid, count(i.invoiceid)
from invoices as i, customers as c
group by i.customerid
返回:
+------------+--------------------+
| CustomerId | count(i.invoiceid) |
+------------+--------------------+
| 1 | 413 |
| 2 | 413 |
| 3 | 413 |
...
结果是 413 = 7 * 59,而 59 是不同 CustomerID 的数量。一定有一些基本的 SQL 行为是我在这里误解的,因为我预计在“from”子句中添加“customers as c”不会有什么不同,因为我还没有使用它。任何人都可以在这里告诉我正在发生的事情吗?
解决方案
切勿在FROM
子句中使用逗号。只使用正确的、明确的、标准的、可读的JOIN
语法。
您的查询正在生成两个表中行的笛卡尔积。然后,您的聚合计算笛卡尔积中每个客户的行数。
你需要这样的东西:
select i.customerid, count(i.invoiceid)
from invoices i join
customers c
on i.customerid = c.customerid
group by i.customerid
推荐阅读
- visual-studio - Xamarin android .axml 文件加载错误:该项目不支持预览
- vim - Easy Vim 的单独设置(带有 -y 标志)
- javascript - 嵌套 if 语句与 &&(or) 运算符
- c# - 尝试使用 httpwebrequest 从 SSL 网站获取数据时出现超时?
- ruby-on-rails - 如何使我的多态模型工作?
- reactjs - 这是 Flux 架构吗?
- excel - Excel 动态地将字段添加到行范围
- swift - 将关于录制麦克风信号的旧 swift 代码行翻译为 swift 4.2
- django - 返回指向django中其他对象的对象
- c# - 为什么 Azure WebJob 无法连接到 Azure SQL,说“存储帐户的类型不受支持‘Blob-Only/ZRS’。支持的类型是‘通用’?