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テーブルから2番目に高い給与を検索しようとしています。
編集:問題は私の理解のようです。私はクエリが実行されるかもしれないと感じる方法を以下に述べました:
私たちは4人の給与10,20,30,40を持つ従業員がいると言う。これで、レコードが1つずつ処理され始めます。したがって、次の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
のように左側にある必要がありますか?
? – GurV
この質問は私には正しいと思われます。実際の問題がありますか? –
WHERE句の条件は、現在の行以上の給与の数を数え、この数が= 2であることを確認します。つまり、2番目に高い給与をとります。 –