42Y36:SELECT列表可能只包含分组列,不允许分组'table。*'

时间:2013-05-11 17:48:54

标签: java jpa derby jpql

以下查询就像一个美女。现在我正在尝试选择导致errorcode

PRODUCT.*

42Y36: (Column reference '<value>' is invalid. For a SELECT list with a GROUP BY, the list may only contain grouping columns and valid aggregate expressions.)

接下来,我尝试将SELECTGROUP BY设置为PRODUCT.*,这会导致errorcode

42X01: (Syntax error: <error>.)

一个普通的语法错误。好吧,似乎不允许在GROUP BY中使用通配符。所以我的问题是(不需要子查询),“如何在使用定义的HAVING - 子句时选择整个对象?”

SELECT      PRODUCT.ID
FROM        PRODUCT
LEFT JOIN   DELIVERYROW   ON  DELIVERYROW.PRODUCT_ID = PRODUCT.ID
LEFT JOIN   DISPATCHROW   ON  DISPATCHROW.PRODUCT_ID = PRODUCT.ID
WHERE       PRODUCT.DTYPE = 'PRODUCT'
GROUP BY    PRODUCT.ID
HAVING      (
                COALESCE(SUM(DELIVERYROW.AMOUNT),0) 
                - 
                COALESCE(SUM(DISPATCHROW.AMOUNT),0)
            ) > 0

1 个答案:

答案 0 :(得分:4)

除非您要对其使用摘要功能,否则您不能在选择中包含不在组中的项目。

您可以在select中包含其他值,但您必须按它们分组或对它们执行SUM(),AVG(),MIN(),MAX()等...这就是产品的原因。*不会在select中工作,你说的是给我所有列但只有group by product.id

通过...扩展解释组的答案

让我们假装产品表有四个cols | id |费用|名字|日期| 如果按ID分组,则将具有相同id的所有行折叠为一行,如果要存在其他列,则必须对它们执行聚合函数,例如,我们可以按id分组并获取min(date),并且max(date)获取每个产品ID的最小/最大日期,我们还可以将(成本)和平均(成本)相加以获得摘要和平均值。

您可以按多个列进行分组,因此我们可以按ID和名称进行分组,为两者的每个唯一组合获取一行。你不能按*分组,这没有多大意义,因为它只会返回你的整个表。

您获得的错误是由于您尝试选择不在您的群组中的列。

您希望输出显示什么?