SQL:使用通配符时结果不同?

时间:2019-04-09 18:30:19

标签: sql postgresql

使用PostgreSQL 9.6.12。

鉴于作者有很多博客文章。

当我运行以下查询时,每个相关的帖子都会得到一行。

SELECT authors.id
FROM authors
LEFT JOIN posts ON authors.id = posts.author_id

运行以下命令时,每个作者只得到一行:

SELECT authors.*
FROM authors
LEFT JOIN posts ON authors.id = posts.author_id

但是,当我对任何一个进行计数时,我得到的行计数就更高。例如。所有帖子的数量。

为什么在使用通配符选择所有列时为什么行计数结果更高?

2 个答案:

答案 0 :(得分:1)

该问题可能是由运行查询的方式以及IDE的设置引起的。这些查询应返回相同的行数。请运行以下查询进行检查。

select count(*) from (SELECT authors.id
FROM authors
LEFT JOIN posts ON authors.id = posts.author_id)

select count(*) from (SELECT authors.*
FROM authors
LEFT JOIN posts ON authors.id = posts.author_id)

答案 1 :(得分:0)

  

为什么当我使用通配符来获取笛卡尔积结果时   选择所有列?

在两个SQL查询中都没有得到笛卡尔乘积。

  

但是,当我对任何一个进行计数时,都会得到笛卡尔积   行数。例如。所有帖子的数量。

您没有计算所有帖子的数量。您正在检索authors表中所有具有作者的帖子。


恐怕您会混淆笛卡尔乘积一词。笛卡尔乘积是第一个表中的行数乘以第二个表中的行数,无限制子句/条件。在简单的SQL中,它对应于以下示例:

SELECT * FROM authors, posts

问题中的两个查询返回的行完全相同,只是第一个查询仅显示id表的列authors,而第二个查询显示{{1}的所有列}表。

这是标准的SQL,我非常相信遵守SQL标准的每种技术都会尊重上述说法。

希望您能理解我的意思,并建议您查看问题。如果您可以显示一些具体示例,则可能会有所帮助,特别是您需要澄清以下内容:

  • “笛卡尔积”是什么意思? (您的定义不同于常用用法)
  • 如何计算行数? (根据您的示例,我很难相信您计算出不同的行数;它们必须相等)