在实现一个问题的时候,同样的结果我写了两个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。