我想问一下是否可以重写以下查询:
SELECT TEAM, COUNT(*)
FROM
(
SELECT ID, TEAM
FROM MY_TABLE
WHERE TO_CHAR(A.SUBMIT_DATE, 'YYYY') = '2019'
GROUP BY ID, TEAM
)
GROUP BY TEAM
使用笛卡尔联接样式? 原因是我正在使用Peoplesoft,并且在不为其创建另一个视图的情况下不允许进行此类子查询。
答案 0 :(得分:2)
您的内部查询将表弄平,以获取2019年不同的ID
和TEAM
组合,然后由外部查询计数。您可以将其快捷方式转到简单的COUNT(DISTINCT)
查询:
SELECT TEAM, COUNT(DISTINCT ID)
FROM MY_TABLE
WHERE TO_CHAR(SUBMIT_DATE, 'YYYY') = '2019'
GROUP BY TEAM;
注意:
ID
值不起作用。如果ID
可为空,请参阅下一个要点。以下注释中来自Tejash的出色技巧,如果ID
可以为NULL,则使用该技巧:
SELECT TEAM, COUNT(DISTINCT ID || TEAM)
... and then the rest of the query from above
Here's a Fiddle与您的查询和我的。 Tejash also did a fiddle。
还有一件事。如果您有很多记录(数千个或更多),并且在SUBMIT_DATE
上有索引,则可以使用SUBMIT_DATE
上的函数通过 not 优化查询:
SELECT TEAM, COUNT(DISTINCT ID)
FROM MY_TABLE
WHERE SUBMIT_DATE >= DATE '2019-01-01'
AND SUBMIT_DATE < DATE '2020-01-01'
GROUP BY TEAM;
如果它是一个有很多行和很多年的大表,那么优化后的版本将明显更快。