@@ -10,16 +10,41 @@ template:
1010 </rule>
1111
1212 limit_rule : |
13- <rule>
13+ <rule priority="high" >
1414 当需要限制行数时:
1515 1. 12c以下版本必须使用ROWNUM语法
1616 2. 12c+版本推荐使用FETCH FIRST语法
1717 <note>
18- 1. 传统写法:WHERE ROWNUM <= 100
19- 2. 现代写法:FETCH FIRST 100 ROWS ONLY
18+ 版本适配:
19+ - Oracle 12c以下:必须使用 WHERE ROWNUM <= N
20+ - Oracle 12c+:推荐使用 FETCH FIRST N ROWS ONLY
2021 </note>
2122 <note>
22- 使用传统 ROWNUM 写法时,若遇到需要分组 GROUP BY 的情况,需要将限制条数的 ROWNUM 写在最外层,不然会影响最后查询出数据的总条数
23+ <strong>重要:ROWNUM必须放在正确的位置,避免语法错误</strong>
24+ 1. <strong>单层查询</strong>:ROWNUM直接跟在WHERE子句后
25+ <template>SELECT ... FROM table WHERE conditions AND ROWNUM <= N</template>
26+ 2. <strong>多层查询</strong>:ROWNUM只能放在最外层
27+ <template>
28+ SELECT ... FROM (
29+ SELECT ... FROM table WHERE conditions GROUP BY ...
30+ ) WHERE ROWNUM <= N -- 正确:在最外层
31+ </template>
32+ 3. <strong>禁止的错误写法</strong>:
33+ <error-example>
34+ SELECT ... FROM table
35+ WHERE conditions
36+ GROUP BY ...
37+ ORDER BY ...
38+ WHERE ROWNUM <= N -- 错误:不能有多个WHERE
39+ </error-example>
40+ 4. <strong>正确顺序</strong>:WHERE → GROUP BY → HAVING → ORDER BY → ROWNUM
41+ 5. <strong>括号位置</strong>:从内层SELECT开始到内层结束都要括起来
42+ <correct>
43+ SELECT ... FROM (
44+ -- 内层完整查询(包含自己的SELECT、FROM、WHERE、GROUP BY、ORDER BY)
45+ SELECT columns FROM table WHERE conditions GROUP BY ... ORDER BY ...
46+ ) alias WHERE ROWNUM <= N
47+ </correct>
2348 </note>
2449 </rule>
2550
@@ -87,6 +112,17 @@ template:
87112 GROUP BY "u"."DEPARTMENT"
88113 ORDER BY "department_name" -- 错误:ROWNUM 应当写在最外层,这样会导致查询结果条数比实际数据的数量少
89114 </output-bad>
115+ <output-bad>
116+ SELECT "department_name", "user_count" FROM
117+ SELECT
118+ "u"."DEPARTMENT" AS "department_name",
119+ count(*) AS "user_count"
120+ FROM "PUBLIC"."USERS" "u"
121+ WHERE "u"."status" = 1
122+ GROUP BY "u"."DEPARTMENT"
123+ ORDER BY "department_name"
124+ WHERE ROWNUM <= 100 -- 错误:语法错误,同级内只能有一个WHERE
125+ </output-bad>
90126 <output-good>
91127 SELECT "department_name", "user_count" FROM (
92128 SELECT
@@ -97,7 +133,7 @@ template:
97133 GROUP BY "u"."DEPARTMENT"
98134 ORDER BY "department_name"
99135 )
100- WHERE ROWNUM <= 100
136+ WHERE ROWNUM <= 100 -- 外层限制(确保最终结果可控)
101137 </output-good>
102138 </example>
103139 </basic-examples>
0 commit comments