【问题标题】:SQL: different results when using wildcard?SQL:使用通配符时结果不同?
【发布时间】:2019-04-10 02:59:24
【问题描述】:

使用 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

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

为什么我使用通配符选择所有列时没有得到更高的行数结果?

【问题讨论】:

  • 通配符只是为了不写所有可选择的字段,它并不意味着任何其他。两个查询都返回相同的行
  • 这些查询都不返回两个表的笛卡尔积。
  • 两次查询返回的行数相同..
  • 那些不是笛卡尔积。
  • 天哪,既然您已经修改了问题,我就花时间回复了。

标签: sql postgresql


【解决方案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)

【讨论】:

  • 很好看。我正在使用一个新的 GUI,它截断了结果。当我在 psql 中进一步向下滚动时,我看到了剩余的结果。谢谢!
【解决方案2】:

当我使用通配符时,为什么我没有得到笛卡尔积结果 选择所有列?

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

但是,当我计算其中任何一个时,我得到的是笛卡尔积 行数。例如。所有帖子的计数。

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


恐怕您混淆了笛卡尔积这个术语。笛卡尔积是第一个表中的行数乘以第二个表中的行数,没有限制子句/条件。在简单的 SQL 中,它将对应于以下内容,例如:

SELECT * FROM authors, posts

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

这是标准 SQL,我非常有信心遵守 SQL 标准的每项技术都会遵守上述规定。

我希望你明白我的意思,并建议你复习这个问题。如果你能展示一些具体的例子可能会有所帮助,特别是你必须澄清:

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

【讨论】:

  • 感谢您的回复。它是在我编辑问题以删除“笛卡尔积”一词之后出现的。我只是在视觉上数行。使用 count 为两者返回相同的值。
  • 我明白了,这是有道理的。如果您直观地计算行数,您使用执行查询的应用程序可能在显示数据时具有某些特定行为。例如。当我使用 SQL Developer 时,它会显示前 50 行;当我滚动到结果列表的末尾时,其余的行会根据需要逐渐显示。你的应用也有特定的行为是否有意义?您使用哪个工具来执行 SQL 查询?
  • 我在 postbird 和 psql 上看到了这个(都在 Ubuntu 18.04 上)
  • 不幸的是,我不熟悉 postbird 或 psql。如果您运行 Ravishankar 的测试并看到相同的行数,您可以放心 - 这是一种特定于工具的行为,您可能会看到该工具决定显示的内容。结果还是正确的。
  • 非常感谢您的耐心和帮助,尽管我误用了这个词。这确实是一个与工具相关的问题。当我在 psql 中进一步向下滚动时,我看到了预期的剩余行,但在 GUI 中没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
相关资源
最近更新 更多