【发布时间】:2015-06-30 08:49:34
【问题描述】:
我不明白为什么我可以这样做:
SELECT YEAR(CREATION_TIME) AS y, MONTH(CREATION_TIME) as m, COUNTRY_CODE
FROM PRODUCTS INNER JOIN COMPANIES
ON COMPANIES.COMPANY_KEY = PRODUCTS.CUSTOMER_ID
WHERE CREATED_BY IN ('VOLVO','SAAB')
但不是
SELECT y FROM
(
SELECT YEAR(CREATION_TIME) AS y, MONTH(CREATION_TIME) AS m, COUNTRY_CODE
FROM PRODUCTS INNER JOIN COMPANIES
ON COMPANIES.COMPANY_KEY = PRODUCTS.CUSTOMER_ID
WHERE CREATED_BY IN ('VOLVO','SAAB')
)
我收到以下错误:
错误:DB2 SQL 错误:SQLCODE=-104,SQLSTATE=42601, SQLERRMC=;;相关名称,驱动程序=3.53.70 SQLState:42601 错误代码:-104 错误:DB2 SQL 错误:SQLCODE=-514,SQLSTATE=26501, SQLERRMC=SQL_CURLH200C1,驱动程序=3.53.70 SQLState:26501 错误代码: -514
我的最终目标是做类似的事情:
SELECT y, m, COUNTRY_CODE, count(*)
FROM
(
SELECT YEAR(CREATION_TIME) AS y, MONTH(CREATION_TIME) AS m, COUNTRY_CODE
FROM PRODUCTS INNER JOIN COMPANIES
ON COMPANIES.COMPANY_KEY = PRODUCTS.CUSTOMER_ID
WHERE CREATED_BY IN ('VOLVO','SAAB')
)
GROUP BY y, m, COUNTRY_CODE
【问题讨论】:
-
不了解 db2,但尝试为您的子查询提供别名。像 SELECT y FROM(...) as T
-
旁注 - 以这种方式按提取的年份和月份分组将忽略索引。加入虚拟/永久日历表可能会带来更好的性能(并且无需包装这部分查询)。永久日历表对这类事情非常有用。