【问题标题】:Postgres Additional Join increases sumPostgres Additional Join 增加总和
【发布时间】:2018-01-20 20:30:08
【问题描述】:
SELECT *, SUM(CASE WHEN "token"."name" = ''  THEN 5 ELSE 9 END) AS "n"
FROM "word"
LEFT OUTER JOIN "token" ON ("word"."id" = "token"."word_id")
where ("word"."id" = 1)
GROUP BY "word"."id";

这给出了 14 的预期结果,因为恰好有一个空令牌和一个非空令牌。

SELECT *, SUM(CASE WHEN "token"."name" = ''  THEN 5 ELSE 9 END) AS "n"
FROM "word"
LEFT OUTER JOIN "token" ON ("word"."id" = "token"."word_id")
INNER JOIN "token" T3 ON ("word"."id" = T3."word_id")
where ("word"."id" = 1)
GROUP BY "word"."id";

这个查询输出n=28,是14的两倍。

这是为什么呢?

【问题讨论】:

  • 你不能有 '*' 和 GROUP BY。毫无意义。

标签: sql postgresql django-models


【解决方案1】:

这是您修改后的查询:

SELECT *, SUM(CASE WHEN t."name" = ''  THEN 5 ELSE 9 END) AS "n"
FROM "word" w LEFT OUTER JOIN
     "token" t
     ON w."id" = t."word_id" INNER JOIN
     "token" T3
     ON w."id" = T3."word_id"
WHERE w."id" = 1
GROUP BY w."id";

这毫无意义。您将word 中的同一列加入token 中的同一列——两次。您得到重复的原因是因为您在token 中有多个给定单词的行。您可以轻松检查:

select word_id, count(*)
from token
group by word_id
having count(*) > 1;

但是,您的查询毫无意义。我可能会建议您问另一个问题,其中包含示例数据、所需结果以及您希望查询做什么的解释。

【讨论】:

  • 为什么没有意义?我自己加入了令牌表。
  • @AndrewFount 。 . .这两个连接位于相同基础表的相同键上。这对我来说没有意义。
  • 如果我写 SELECT *, SUM(CASE WHEN "token"."name" = '' THEN 5 ELSE 9 END) AS "n" FROM "word" LEFT OUTER JOIN 为什么会有区别"token" ON ("word"."id" = "token"."word_id") INNER JOIN "token" T3 ON ("token"."id" = T3."id") where ("word"." id" = 1) GROUP BY "word"."id";
  • @AndrewFount 。 . .是的,但这也没有多大意义。为什么要对表中的 id 列进行自联接。我建议你问另一个问题,包括样本数据、期望的结果和你想要做什么的解释。
猜你喜欢
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2014-06-21
  • 2016-02-01
相关资源
最近更新 更多