【问题标题】:Many-to-many SELECT divided into multiple rows for some reason多对多 SELECT 由于某种原因分成多行
【发布时间】:2018-12-09 07:56:40
【问题描述】:

我有两个表通过第三个以多对多关系连接。为了简化:

表 A ID-A(整数) 名称(varchar) 分数(数字)

表 B ID-B(整数) 名称(varchar)

表 AB ID-AB(整数) A(外键ID-A) B(外键ID-B)

我想要的是显示属于给定 B 的所有 As 的 B-Name 和“Score”值的总和。但是,以下代码:

WITH "Data" AS(
SELECT "B."."Name" As "BName", "A"."Name", "Score"
FROM "AB"
LEFT OUTER JOIN "A" ON "AB"."A" = "A"."ID-A"
LEFT OUTER JOIN "B" ON "AB"."B" = "B"."ID-B")

SELECT "BName", SUM("Score") AS "Total"
FROM "Data"
GROUP BY "Name", "Score"
ORDER BY "Total" DESC

结果会为每个“BName”显示几行,其中“分数”在这些行之间划分为几乎随机的增量。例如,如果 Johnny 的期望结果是 12,而 April 的期望结果是 25,则查询可能会显示如下内容:

约翰尼 | 7

约翰尼 | 3

约翰尼 | 2

四月 | 19

四月 | 5

四月 | 1

等等

即使在尝试嵌套查询并使用 SUM("Score") 执行另一个 SELECT 之后,结果也是一样的。我不确定我做错了什么?

【问题讨论】:

  • A minimal reproducible example 包括 DBMS(带版本)、清晰的规范、剪切和粘贴和可运行代码(具有小的代表性输入)(将表初始化格式化为表)和可区分(因此排序)所需的输出.但是调试的绝对基础说:表明你的程序在通过(子)表达式时做了你期望的事情,说明它是什么,并表明它实际上是通过增量输出做到的。在添加您无法修复的问题代码时,请研究(手册和网络)。重复,尽量减少工作代码和错误代码。然后询问工作示例和非工作示例之间的(小)差异。

标签: join select many-to-many firebird


【解决方案1】:

GROUP BY 子句中删除Score

SELECT BName, SUM(Score) AS Total
FROM Data
GROUP BY BName
ORDER BY Total DESC;

查询的目的是按名称进行汇总,因此名称应单独出现在GROUP BY 子句中。通过还包括分数,您将在输出中获得每个唯一名称/分数组合的记录。

【讨论】:

  • GROUP BY 中没有“Score”,Firebird 向我抛出错误,说我不能使用 SUM。
  • 糟糕!我的错误,修复'
  • @eworm 似乎不太可能“在 GROUP BY 中没有“分数””DBMS“向我抛出错误,说我不能使用 SUM。
【解决方案2】:

好的,我发现了我的问题。事实上,我只需要按“名称”分组,但我认为 Firebird 不允许我这样做。原来这只是一个错字。哎呀。

【讨论】:

  • 鉴于我说的基本相同,您能否将我的答案标记为正确?
  • 指定拼写错误可能会更有帮助。
猜你喜欢
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多