对oracle sql的一些总结

在实现一个问题的时候,同样的结果我写了两个sql。

sql1

 1 SELECT C1.*, C2.CF_NAMES
 2   FROM FAMS_CLASSIFY C1
 3   LEFT JOIN (SELECT A.CL_ID, LISTAGG(B.CF_NAME, ',') WITHIN GROUP(ORDER BY B.CF_NAME) AS CF_NAMES
 4                FROM FAMS_CLASSIFY A
 5                LEFT JOIN FAMS_CUSTOMFIELD B
 6                  ON A.CL_ID = B.CL_ID
 7               GROUP BY A.CL_ID) C2
 8     ON C1.CL_ID = C2.CL_ID
 9  WHERE C1.CL_TYPE = '2'
10    AND C1.CL_STATUS = '0'
11      AND 1=1
12  ORDER BY C1.CL_PID ASC, C1.CL_ID ASC

sql2

 1 SELECT A.CL_ID,
 2        A.CL_NAME,
 3        A.CL_PID,
 4        A.CL_PNAME,
 5        LISTAGG(B.CF_NAME, ',') WITHIN GROUP(ORDER BY B.CF_NAME) AS CF_NAMES
 6   FROM FAMS_CLASSIFY A
 7   LEFT JOIN FAMS_CUSTOMFIELD B
 8     ON A.CL_ID = B.CL_ID
 9  WHERE A.CL_TYPE = '2'
10    AND A.CL_STATUS = '0'
11    AND 1 = 1
12      GROUP BY A.CL_ID, A.CL_NAME, A.CL_PID, A.CL_PNAME
13  ORDER BY A.CL_PID ASC, A.CL_ID ASC  ;

在效率问题上询问了前辈,得到的建议是使用第二个,因为分组跟子查询都会影响效率,相比之下分组好一点。

 

另外产生的一个问题是,如果使用.net并使用c#语言实现sql的话,第一个sql是无法(在我的能力范围内)使用拉姆达查询对象的,但是又需要做结果分页。

以前用的是拉姆达查询对象的一个toPageList()方法,d进去发现里面的sql使用的是skip和take来分页,但是百度上都说oracle是使用rownum来分页的,没有其他分页方法。

最后询问知道skip和take是 Linq 的语法,转换成sql可能也是rownum。

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐