代码之家  ›  专栏  ›  技术社区  ›  steel

SQL:使用通配符时没有笛卡尔乘积?

  •  0
  • steel  · 技术社区  · 7 年前

    假设一个作者有很多博客帖子。

    当我运行以下查询时,我会为每个关联的帖子获取一行。

    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
    

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

    0 回复  |  直到 7 年前
        1
  •  1
  •   a_horse_with_no_name    7 年前

    问题可能是由运行查询的方式以及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)
    
        2
  •  0
  •   Ely    7 年前

    选择所有列?

    行数。例如,所有职位的计数。

    你不是在计算所有帖子的数量。 您正在检索中包含作者的所有帖子 authors


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

    SELECT * FROM authors, posts
    

    问题中的两个查询返回完全相同的行,只是第一个查询只显示列 id 作者

    这是标准的SQL,我非常有信心,每一项尊重SQL标准的技术都会尊重上述内容。

    我希望你明白我的意思,并建议你重新审视这个问题。如果你能给出一些具体的例子,可能会有所帮助,尤其是你必须澄清:

    • 你怎么计算行数?(根据你的例子,我很难相信你数了不同的行数;它们必须相等)