2017-02-26 112 views
0

對於下面的查詢:MySql的相關子查詢執行

SELECT Id, Salary 
FROM Employee e 
WHERE 2 = (SELECT COUNT(DISTINCT Salary) FROM Employee p 
      WHERE e.Salary<=p.Salary) 

不應該在子查詢的e.salary<=p.salary狀況得到扭轉。我們應該重複比較p.salary列與外部查詢中的e.salary列,因此p.salary必須位於左側。如果我的理解錯誤,請讓我知道。

PS:上述查詢試圖從Employee表中查找第二高薪水。

編輯:這個問題似乎在我的理解。我在下面提到我如何感覺查詢可能被執行:

假設我們有一個僱員,有4個薪水10,20,30,40。現在記錄開始逐一處理。所以我們得到以下4箇中間實現:

`code` 
SELECT Id, Salary 
FROM Employee e 
WHERE 2 = (SELECT COUNT(DISTINCT p.Salary) 
      FROM Employee p 
      WHERE 10<=p.salary -- record with salary 10 
     ); 
SELECT Id, Salary 
FROM Employee e 
WHERE 2 = (SELECT COUNT(DISTINCT p.Salary) 
      FROM Employee p 
      WHERE 20<=p.salary 
     ); 
SELECT Id, Salary 
FROM Employee e 
WHERE 2 = (SELECT COUNT(DISTINCT p.Salary) 
      FROM Employee p 
      WHERE 30<=p.salary 
     ); 
SELECT Id, Salary 
FROM Employee e 
WHERE 2 = (SELECT COUNT(DISTINCT p.Salary) 
      FROM Employee p 
      WHERE 40<=p.salary 
     ); 
`code` 

這個命令是否正確?不應該我們試圖比較的列,即p.salary必須在左側,如p.salary>=e.salary

+0

您正在使用哪個數據庫:

在大多數數據庫,您可以使用dense_rank()表達這個代替這樣的相關子查詢的? – GurV

+0

這個查詢對我來說看起來是正確的。你有沒有真正的問題? –

+0

「WHERE」條款中的條件表示計算> =當前行的薪水數量,並確保此數字爲= 2 ...換句話說,取第二高的薪水。 –

回答

1

這是查詢:

SELECT Id, Salary 
FROM Employee e 
WHERE 2 = (SELECT COUNT(DISTINCT p.Salary) 
      FROM Employee p 
      WHERE e.Salary <= p.Salary 
     ); 

據計數的不同薪水是大於或等於任何給定僱員的工資的數目。也就是說,查詢會計算考慮關係的第二大薪水。

如果你「逆轉」了條件,你會做其他事情。

SELECT Id, Salary 
FROM (SELECT e.*, 
      DENSE_RANK() OVER (ORDER BY e.salary) as dr 
     FROM Employee e 
    ) e 
WHERE dr = 2; 
+0

我想我需要再次制定邏輯。假設我們有一個僱員,有4個工資10,20,30,40。現在記錄開始逐一處理。因此,我們種得到以下4箇中間實現: 選擇ID,薪酬 FROM僱員ë WHERE 2 =(SELECT COUNT(DISTINCT p.Salary) FROM僱員p WHERE e.Salary <= 10 ); – Ronald

+0

請檢查問題。我修改了這個問題 – Ronald