2016-11-30 225 views
0

我想通過使用基於連接表的條件來篩選出行的最佳方法。作爲一個例子,我根據每位員工的工資等級加入員工和工資等級表。然後,我只想顯示與某位員工(布萊克)具有相同等級的員工。我使用下面的代碼:在連接表上使用WHERE子句

SELECT e.ename, e.sal, sg.grade 
FROM emp e JOIN salgrade sg 
ON(e.sal BETWEEN sg.losal AND sg.hisal) 
WHERE sg.grade = (SELECT sg.grade FROM emp e JOIN salgrade sg ON(e.sal BETWEEN sg.losal AND sg.hisal) WHERE e.ename = 'BLAKE') 
ORDER BY e.sal DESC 

是否有更優化的方式來編寫查詢?

+0

什麼數據庫系統,您使用的? SQL Server,Oracle,MySQL? –

+0

我使用Oracle * –

+0

我們能否看到來自兩個表的一些示例數據? – VDK

回答

0

下面是一個使用窗口功能的一種方法:

SELECT es.* 
FROM (SELECT e.ename, e.sal, sg.grade, 
      MAX(CASE WHEN e.ename = 'BLAKE' THEN sg.grade END) OVER() as blake_grade 
     FROM emp e JOIN 
      salgrade sg 
      ON e.sal BETWEEN sg.losal AND sg.hisal 
    ) es 
WHERE grade = blake_grade 
ORDER BY e.sal DESC; 
+0

是的,這正是我想要做的,但這超出了我目前的課程範圍。也許我做這件事的方式可能是用我想到的東西去解決它的唯一方法。 –

0

我不會用在選擇的聯接WHERE子句;相反,我會使用內部標量子查詢來獲取BLAKE的薪水,然後使用外部標量子查詢來獲取他的salgrade。否則非常相似,您的查詢:

select e.ename, e.sal, s.grade 
from emp e inner join salgrade s on e.sal between s.losal and s.hisal 
where s.grade = (select grade 
        from salgrade 
        where (select sal from emp where ename = 'BLAKE') 
                 between losal and hisal 
       ) 
order by sal desc 
; 

使用相同的想法,你可能會在第加盟以及做掉(通過返回布雷克的losalhisal以及他salgrade),但也許這就是服用它太過分了。

+0

這正是我所尋找的,更不要說隨意性。我不喜歡我的代碼的事情是,我在子查詢中使用連接,出於某種原因,我想不出使用連接表來找到它。無論如何,謝謝! –

0

如果這只是不必兩次寫相同的代碼,你可以使用一個WITH條款:

WITH emps_and_sals AS 
(
    SELECT e.ename, e.sal, sg.grade 
    FROM emp e 
    JOIN salgrade sg ON e.sal BETWEEN sg.losal AND sg.hisal 
) 
SELECT * 
FROM emps_and_sals 
WHERE grade = (SELECT grade FROM emps_and_sals WHERE ename = 'BLAKE') 
ORDER BY sal DESC;