用笛卡尔联接

时间:2019-07-26 00:35:33

标签: sql oracle peoplesoft

我想问一下是否可以重写以下查询:

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,并且在不为其创建另一个视图的情况下不允许进行此类子查询。

1 个答案:

答案 0 :(得分:2)

您的内部查询将表弄平,以获取2019年不同的IDTEAM组合,然后由外部查询计数。您可以将其快捷方式转到简单的COUNT(DISTINCT)查询:

SELECT TEAM, COUNT(DISTINCT ID)
FROM MY_TABLE
WHERE TO_CHAR(SUBMIT_DATE, 'YYYY') = '2019'
GROUP BY TEAM;

注意:

  • 正如加里·迈尔斯(Gary Myers)在评论中指出的那样,如果空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;

如果它是一个有很多行和很多年的大表,那么优化后的版本将明显更快。

相关问题