[HackerRank] Placements


Q. You are given three tables: Students, Friends and Packages. Students contains two columns: ID and Name. Friends contains two columns: ID and Friend_ID (ID of the ONLY best friend). Packages contains two columns: ID and Salary (offered salary in $ thousands per month).


< Students >
ColumnTypeIDIntegerNameString
< Friends >
ColumnTypeIDIntegerFriend_IDInteger
< Packages >
ColumnTypeIDIntegerSalaryFloat
Write a query to output the names of those students whose best friends got offered a higher salary than them. Names must be ordered by the salary amount offered to the best friends. It is guaranteed that no two students got same salary offer.
Sample Input
< Students >
IDName1Ashley2Samantha3Julia4
< Friends >
IDFriend_ID12233441
< Packages >
IDSalary115.20210.06311.55412.12
Sample Output
Samantha
Julia
Scarlet

正解

SELECT sub.Name
FROM (SELECT f.ID, s.Name, f.Friend_ID, p.Salary AS first_Salary
      FROM Students s
       INNER JOIN Friends f ON s.ID = f.ID
       INNER JOIN Packages p ON f.ID = p.ID) sub
 INNER JOIN Packages p ON sub.Friend_ID = p.ID
WHERE sub.first_Salary < p.Salary
ORDER BY p.Salary

に答える

  • は、まずテーブル全体に接続されます.
  • SELECT f.ID, s.Name, f.Friend_ID, p.Salary
    FROM Students s
    INNER JOIN Friends f ON s.ID = f.ID
    INNER JOIN Packages p ON f.ID = p.ID;
    すべてのテーブルをINNER JOINに接続し、IDとNAME、FRIEND ID.SALARYを出力します.
    出力は次のとおりです.

    生徒と親友のSallyを比較する必要があるので(あ~それ以降はWHERE句の比較演算子~)、Sallyが2つ必要です.これは、サブクエリを使用する必要があることを意味します.
  • サブクエリ
  • を作成
    SELECT *
    FROM (SELECT f.ID, s.Name, f.Friend_ID, p.Salary AS first_Salary
          FROM Students s
        INNER JOIN Friends f ON s.ID = f.ID
        INNER JOIN Packages p ON f.ID = p.ID) sub
    上の図に示すように、サブクエリを作成してクエリ全体を出力すると、次のように出力されます.
  • 親友のSalry
    サブクエリが追加されました.これを使用して、友達の給与を表に表示する必要があります.これにより、友達の給与をWHEREセクションより高い位置に掛けることができます.既存の表には、学生のIDと友人のIDとSallyがあり、この場合は学生のSallyのみであり、学生の親友のSallyを表現するために、親友のIDは自分のIDとSally情報のあるPackagesで接続でき、「学生ID、友人ID、学生給与、友人ID、友人給与」その姿が見えると思います.
  • SELECT *
    FROM (SELECT f.ID, s.Name, f.Friend_ID, p.Salary AS first_Salary
          FROM Students s
        INNER JOIN Friends f ON s.ID = f.ID
        INNER JOIN Packages p ON f.ID = p.ID) sub
    INNER JOIN Packages p ON sub.Friend_ID = p.ID
    上記のサブクエリに従って作成されたテーブルの友達idとidによってpayleingを表すpackagesテーブルのidとjoinの場合、後で友達idベースのpayleingが表示されます.

    青は既存生徒のid、赤は友人のidと友人のidを組み合わせたSalry.
    順序変更の原因は,友人idとid情報を含むテープ間の接続であるため,1からリストされる様子である.
    今は条件を出せば終わりです
  • 掛条件
  • SELECT sub.Name
    FROM (SELECT f.ID, s.Name, f.Friend_ID, p.Salary AS first_Salary
          FROM Students s
           INNER JOIN Friends f ON s.ID = f.ID
           INNER JOIN Packages p ON f.ID = p.ID) sub
    INNER JOIN Packages p ON sub.Friend_ID = p.ID
    WHERE sub.first_Salary < p.Salary
    ORDER BY p.Salary