单列多行转单行单列合并oracle_Oracle - 子查询、TOP - N
1 子查詢
sql 中查詢是可以嵌套的,一個查詢的結果可以作為另外一個查詢的條件、表。
SELECT select_list FROM table WHERE expr operator(SELECT select_listFROM table);理解子查詢的關鍵在于把子查詢當作一張表來看待,外層的語句可以把內嵌的子查詢返回的結果當成一張表使用,子查詢結果可以作為一個虛表被使用。注意,子查詢要用括號括起來 。子查詢根據其返回結果可以分為單行子查詢和多行子查詢。
1.1 單行子查詢
當子查詢有單行時,可以取單行中的一個字段形成單個值用于條件比較,特別是當子查詢結果為單行單列時,可以當成一個值用于比較。
-- 查詢雇員其薪資在雇員平均薪資以上的雇員 select * from emp e where e.sal > (select avg(e.sal) "AVGSAL" from emp e);1.2 多行子查詢
多行子查詢返回的結果可以作為表使用,通常結合in、some/any、all、exists。
-- 查在雇員中有哪些人是管理者 select e.* from emp e where e.empno in (select distinct e.mgrfrom emp ewhere e.mgr is not null);1.3 from 后的子查詢
子查詢結果可以作為一張續表用于from后。
-- 每個部門平均薪水的等級 select vt0.deptno,vt0.avgsal,sg.grade from (select e.deptno,avg(e.sal) "AVGSAL"from emp egroup by e.deptno) VT0, salgrade sg where vt0.avgsal between sg.losal and sg.hisal2 TOP - N
在 Oracle 中和 mysql 不一樣,沒有 top 關鍵字,只能通過 rownum 屬性作為篩選條件,實現取“前 N 個幾個”。
rownum:表示對查詢結果的數據集記錄的編號,從1開始。
-- 查詢前10名雇員 select e.*,rownum from emp e where rownum <= 10當我們要查詢前 6 - 10 名雇員的時候就出現了問題。rownum 后面接 “<”、“<=”時不會出現問題,但取的第一個結果不是 rownum = 1 時,就會出現結果為空集的問題。例如 rownum >= 1 結果正常,但是 rownum > 1 為空集。可以這么理解,rownum 是對結果集進行編號,當程序執行where rownum > 1 時,把結果的第一行排除掉了,但是此時的結果集第一個記錄 rownum 由 2 變成了 1,于是繼續把這一條記錄也剔除掉,以此類推,最后所有數據都被剔除了。
要解決這個問題,采取的方法時將 rownum 固定住,也就是將原表和 rownum 合成一個新表,新表上 rn 字段表示行數,在這個新表上再作判斷。
--求薪水最高的第6到10名雇員 SELECT * FROM (SELECT X.*, ROWNUM NUM FROM (SELECT E.* FROM EMP E ORDER BY E.SAL DESC) X) WHERE NUM BETWEEN 6 AND 10;總結
以上是生活随笔為你收集整理的单列多行转单行单列合并oracle_Oracle - 子查询、TOP - N的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ doxygen 注释规范_[代码
- 下一篇: 对应 网口_威纶通网口屏和西门子1200