以下查询就像一个美女。现在我正在尝试选择导致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.)
接下来,我尝试将SELECT
和GROUP 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
答案 0 :(得分:4)
除非您要对其使用摘要功能,否则您不能在选择中包含不在组中的项目。
您可以在select中包含其他值,但您必须按它们分组或对它们执行SUM(),AVG(),MIN(),MAX()等...这就是产品的原因。*不会在select中工作,你说的是给我所有列但只有group by product.id
通过...扩展解释组的答案
让我们假装产品表有四个cols | id |费用|名字|日期| 如果按ID分组,则将具有相同id的所有行折叠为一行,如果要存在其他列,则必须对它们执行聚合函数,例如,我们可以按id分组并获取min(date),并且max(date)获取每个产品ID的最小/最大日期,我们还可以将(成本)和平均(成本)相加以获得摘要和平均值。
您可以按多个列进行分组,因此我们可以按ID和名称进行分组,为两者的每个唯一组合获取一行。你不能按*分组,这没有多大意义,因为它只会返回你的整个表。
您获得的错误是由于您尝试选择不在您的群组中的列。
您希望输出显示什么?