【问题标题】:SQL In and having-clause, why do they produce different results?SQL In和have-clause,为什么它们会产生不同的结果?
【发布时间】:2015-04-20 04:38:25
【问题描述】:

考虑到以下关系movie {country,major_genre,production_year, run_time, title,我想列出除西班牙以外的所有国家,在该国家/地区制作的电影,只要其中至少有两部。

我写了两个查询,它们以某种方式产生了不同的结果。似乎第一个是正确的,但在我看来,它们是平等的。我正在学习 SQL。有人可以帮助解释这些差异吗?谢谢你的帮助!

第一个:

SELECT m1.country, m1.production_year, m1.title
FROM movie m1
WHERE m1.country <> "Spain"
AND m1.country
IN (
    SELECT m2.country
    FROM movie m2
    GROUP BY m2.country        //select only the ones with at least 2 movies
    HAVING COUNT( * ) >=2
 )
ORDER BY m1.country ASC , m1.production_year DESC 

第二个:

SELECT m1.country, m1.production_year, m1.title
FROM movie m1
WHERE m1.country <> "Spain"
GROUP BY m1.country
HAVING COUNT( * ) >=2  //the country selected should have count of at least 2 rows
ORDER BY m1.country ASC , m1.production_year DESC

【问题讨论】:

  • 我的第一个问题是,第二个查询有效吗?
  • 看起来像一个 MySQL 查询,它放宽了与 GROUP BY 子句相关的规则。仅供参考,第二个查询不正确,因为您必须列出 SELECT 列表中的 GROUP BY 子句中的所有列
  • 我在 select 语句中看到“m1.country, m1.production_year, m1.title”,但在 group by 你只有 m1.country
  • 是的,第二个有效..
  • 但是在group by中加入“m1.country, m1.production_year, m1.title”后还是不正确

标签: sql count group-by aggregate-functions having-clause


【解决方案1】:

问题是第二个查询在单个列上使用 GROUP BY,但返回 3 列。因此,每个拥有 > 1 部电影的国家/地区都会出现一次,其中年份和电影的值是“随机”的(实际上可能不是随机的)。

你也可以不用GROUP BY

SELECT m1.country, m1.production_year, m1.title
FROM movie m1
WHERE m1.country <> "Spain"
AND 1 < (
    SELECT count(*) 
    FROM movie m2
    WHERE m2.country = m1.country
  )
ORDER BY m1.country ASC , m1.production_year DESC 

这是一个小提琴:http://sqlfiddle.com/#!9/e2ddc/2

【讨论】:

  • 谢谢!但我试图理解为什么第二个不起作用。即使在我将m1.country, m1.production_year, m1.title 添加到 GROUP BY 之后,它仍然不正确。
  • 因为COUNT(*) 适用于GROUP BY 中的所有列。因此,在您最初的第二个查询中,您要求 按国家/地区汇总并仅保留组中 > 1 的国家/地区,然后从某处添加年份和标题。这就是为什么它不太有效。您已经将每个国家/地区的行汇总到一个,因此您不能回到每个国家/地区拥有多个行。
  • 如果您要求GROUP BY 更多列,COUNT(*) 将不再是您想要的,因为您正在计算年份和头衔。您不能在一个步骤中同时分组(按国家/地区)和包含您忽略的组的内容(年份、标题)。
猜你喜欢
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
相关资源
最近更新 更多