2016-12-11 132 views
0

使用以下問題,您能否向我解釋兩個SQL之間的區別以及爲什麼它們不具有相同的結果?爲什麼一個查詢返回的結果多於其他

顯示工資和佣金與位於ID1700的任何員工的工資和佣金相匹配的任何員工的姓氏,部門名稱和薪水。

SELECT E.LAST_NAME, D.DEPARTMENT_NAME, E.SALARY 
    FROM EMPLOYEES E 
    JOIN DEPARTMENTS D 
    ON (E.DEPARTMENT_ID =D.DEPARTMENT_ID) 
    WHERE E.SALARY IN (SELECT SALARY 
         FROM EMPLOYEES 
         WHERE D.LOCATION_ID = 1700) AND 
     E.COMMISSION_PCT IN (SELECT COMMISSION_PCT 
           FROM EMPLOYEES 
           WHERE D.LOCATION_ID = 1700); 

(0輸出)

SELECT e.last_name, d.department_name, e.salary 
    FROM employees e, 
     departments d 
    WHERE e.department_id = d.department_id AND 
     (salary, NVL(commission_pct,0)) IN (SELECT salary, 
                NVL(commission_pct,0) 
               FROM employees e, 
                departments d 
               WHERE e.department_id = d.department_id AND 
                d.location_id = 1700); 

(36輸出)

+0

你實際使用哪個數據庫?我猜測甲骨文,我也​​猜測這是一個家庭作業問題。 –

+0

是的,Oracle數據庫。 我試圖找出爲什麼0輸出一個不起作用。 (我自己寫的)。 問題的解決方案是具有36個輸出的解決方案。 我不知道爲什麼我的SQL類型不正確,看起來對我很正確,但顯然不是基於結果。 –

+0

添加一些示例表格數據和當前的兩個結果。 (以及格式化文本。)同時向我們顯示想要的結果。 – jarlh

回答

2

注意,此查詢:

SELECT e.last_name, d.department_name, e.salary 
    FROM employees e, 
     departments d 
    WHERE e.department_id = d.department_id AND 
     (salary, NVL(commission_pct,0)) IN (SELECT salary, 
                NVL(commission_pct,0) 
               FROM employees e, 
                departments d 
               WHERE e.department_id = d.department_id AND 
                d.location_id = 1700); 

...將包括任何有相同的員工薪水和佣金,作爲地點1700中的某人。因此,1700地點的所有員工都將被納入結果集。但是也可以找到不在該地點的其他員工,如果只有位於1700的人員具有完全相同的薪水和佣金。所以這個查詢對給定的賦值正確回答。

然而,其他查詢具有在兩個子查詢奇數條件下,它適用於外查詢條件(僅其中D定義的地方) - 而不是子查詢 - 和它這樣做兩次(這不利於):

SELECT E.LAST_NAME, D.DEPARTMENT_NAME, E.SALARY 
    FROM EMPLOYEES E 
    JOIN DEPARTMENTS D 
    ON (E.DEPARTMENT_ID =D.DEPARTMENT_ID) 
    WHERE E.SALARY IN (SELECT SALARY 
         FROM EMPLOYEES 
         WHERE D.LOCATION_ID = 1700) AND 
     E.COMMISSION_PCT IN (SELECT COMMISSION_PCT 
           FROM EMPLOYEES 
           WHERE D.LOCATION_ID = 1700); 

你不能改變什麼實質性的,如果你會外where子句中前進location_id這一條件。現在很明顯,這個查詢不包括任何不在地點1700的員工 - 對於其他查詢,這不總是正確的。

此外,這一個不具有NVL函數應用於commission_pct,這意味着員工將也被排除在外,如果他們有null作爲commission_pct。這是因爲NULL IN (SELECT ...)總是評估爲false。

所以,這個查詢返回更少的記錄有兩個原因,也是爲什麼它是你得到的任務的錯誤答案。

+0

謝謝先生,有沒有更簡單的方法來使用我的方法重寫查詢?可以使用JOIN? 而且我不太瞭解「你不會改變任何實質性的,如果你將這個條件移動到外部where子句中的location_id上」意思是...... –

+0

對不起,我認爲你的問題是*「兩個SQL之間有什麼區別以及爲什麼他們沒有現在你要求重寫查詢嗎?如果這是你的問題,請發佈一個新問題(沒問題)。我對'location_id'條件的評論意味着這個條件不涉及任何子查詢,所以很具誤導性。這是外部查詢條件,所以應該放在那裏。我說這樣的舉動不會改變結果。但它更好地說明會發生什麼。 – trincot

相關問題