2017-04-09 9 views
1

サブクエリリストを使用すると、女性従業員よりも高い給与を持つすべての男性従業員が使用されます。これは正しいか?また、私はそれをINステートメントに変更する必要があります。私が試したすべてが女性の給料を返します。それはきわめて明確であるので、私は、このバージョンが好きIN文の遷移

SELECT m.* 
FROM Employee m 
WHERE m.Gender = 'M' AND 
     m.Salary > (SELECT MAX(f.Salary) 
        FROM Employee f 
        WHERE f.Gender = 'F' 
       ); 

SELECT FirstName, LastName, Salary 
FROM Employee 
WHERE Salary > ALL 
(Select Salary FROM Employee 
WHERE Gender = 'F') 
+0

私はこれが正しいとは思わない。クエリは「女性の従業員よりも給与の高いすべての従業員」になるはずです。私は、出力を男性に限定するために、メインのクエリにwhere句を追加するべきだと思います。 "IN"への移行方法について教えてください。 – mrtig

+0

私は基本的に、ALLの代わりにINを使うだけで同じステートメントが必要です。 –

+0

これを 'IN'に変更することは賢明な方法ではないと思いますが、' NOT EXISTS'に変更することができます。それはあなたのニーズを満たすでしょうか? –

答えて

0

私はゴードンの答えは、技術的には次のものよりもはるかに優れていると思います。彼はそれを正しくやっている。 INの使用要件は、奇妙なことです。 x > ALL y以来

は当然NOT EXISTS y such that x <= yEXISTSに変換され、比較的自然にINに変換することができ、我々はx NOT IN (z such that z <= y)としてこれを行うことができます。 (私は自由のためのあなたのためのいくつかのボーナスでIN秒を投げた)Employeeテーブルを想定すると、PKフィールドがEmployeeIDと呼ばれており、以下のように、あなたがこれを行うことができます:

SELECT 
    m.FirstName, 
    m.LastName, 
    m.Salary 
FROM 
    Employee m 
WHERE 
    m.Gender IN ('M') 
    AND m.Salary is not null 
    AND m.EmployeeID NOT IN 
    (
    select m2.EmployeeID 
    from Employee m2 
    where m2.Salary <= (select f.Salary 
         FROM Employee f 
         where f.Gender IN ('F')) 
    ) 
    AND 'Why' IN ('Why','IN','Why','?') 
    AND 'Why' NOT IN ('Another','Way','?') 

これは恐ろしいとはるかに少ない効率的なゴードンの答えを超えています。

これがコースの課題の一部である場合、この課題を設定する人が何を考えているのだろうかと疑問を抱かせる必要があります。彼らが何をしているのか分かりませんが、論理的なフープを飛び越えたり、複数の異なる方法で同じことを達成することが可能であることを教えたりすることがあります。等しく効率的ではありません。

+0

LOL、ありがとうございました! –

0

まず、私はこのように書きます。これは、「最も高い賃金の女性よりも多くの収入を得るすべての男性を取得する」というほぼ直接的な翻訳です。

genderは2つの値しか取らないという前提で、バージョンも動作します。しかし、それは微妙に依存します:比較は>です。だから、女性は、すべての女性(自分自身を含む)よりも高い給与を持つことができません。したがって、外側のクエリは、男性であることになっているnot-femalesのみを返すことができます。

精神的な体操を経るのではなく、= 'M'の条件は、クエリの意図をはるかに明確にします。その条件付き

、クエリは明確である:

SELECT m.* 
FROM Employee m 
WHERE m.Gender = 'M' AND 
     m.Salary > ALL (SELECT f.Salary 
         FROM Employee f 
         WHERE f.Gender = 'F' 
        ); 

私は、このバージョンは、一つのエッジケースでMAX()とのバージョンよりも優れていることに注意してください。女性がいない場合、すべての従業員が返却されます。 MAX()のバージョンでは、行がまったく返されません。

私は次を追加する必要があります。INを使用してこのクエリを少なくとも現実的な方法でバージョンに変換する方法は明白ではありません。

+0

ありがとうございました!ええ、私は本当にこの場合のINステートメントを理解していません。しかし、私はまだそれを把握する必要があります。 –