首页 > 解决方案 > 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”不会有什么不同,因为我还没有使用它。任何人都可以在这里告诉我正在发生的事情吗?

标签: sql

解决方案


切勿FROM子句中使用逗号。只使用正确的、明确的、标准的、可读的JOIN语法。

您的查询正在生成两个表中行的笛卡尔积。然后,您的聚合计算笛卡尔积中每个客户的行数。

你需要这样的东西:

select i.customerid, count(i.invoiceid)
from invoices i join
     customers c
     on i.customerid = c.customerid
group by i.customerid

推荐阅读