2017-02-26 2 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テーブルから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のように左側にある必要がありますか?

+0

? – GurV

+0

この質問は私には正しいと思われます。実際の問題がありますか? –

+0

WHERE句の条件は、現在の行以上の給与の数を数え、この数が= 2であることを確認します。つまり、2番目に高い給与をとります。 –

答えて

1

これはクエリです:

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

それは大きいまたは任意の従業員の給与に等しい明確な給与の数をカウントしています。つまり、クエリは、関係を考慮して2番目に大きい給与を計算します。

条件を「逆」にすると、何か他のことが実行されます。

ほとんどのデータベースでは、あなたは、このような相関副問合せの代わりにdense_rank()を使用してこれを表現することができます:あなたが使用しているデータベース

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を持つ従業員テーブルがあるとします。これで、レコードが1つずつ処理され始めます。そこで、この種の次の4つの中間実装得る: SELECT ID、給与 従業員E FROM WHERE 2 =(社員P FROM SELECT COUNT(DISTINCT p.Salary) WHERE e.Salary <= 10 )。 – Ronald

+0

ご質問をお願いします。私は質問を修正した – Ronald

関連する問題