【问题标题】:How to order names in a column based on an index sequence in another table?如何根据另一个表中的索引序列对列中的名称进行排序?
【发布时间】:2021-01-08 21:24:40
【问题描述】:

所以我有 3 个表 FriendsStudents,它们都有一个 ID 列。但在 Friends 表中,还有一个称为 Friend_ID 的列。我想按照 Friend_ID 的排序方式重新排序 Friends 中的 Name 列。有可能吗?

这是针对问题的 - https://www.hackerrank.com/challenges/placements/problem?isFullScreen=false

注意:我想使用这个 没有 ORDER BY 子句,因为这将是一个子查询。

我在 SQL Server 中的查询。

WITH 
    CTE (NID,N_Name,N_Salary,FID) AS
    (SELECT S.ID AS NID, S.Name AS N_Name, P.Salary AS N_Salary, F.Friend_ID AS FID 
     FROM Students S JOIN Friends F
     ON S.ID = F.ID JOIN Packages P 
     ON S.ID = P.ID),
     
     
--SELECT L.NID,L.N_Name,L.N_Salary,L.FID,R.FN_Sal
SELECT 
   IIF(L.N_Salary > R.FN_Sal,
       IIF(L.FID IN (SELECT ID FROM Students WHERE Students.ID=R.N_ID),L.N_Name,"No val")
    ,NULL)

FROM CTE L
JOIN 
    (SELECT F.ID AS N_ID, P.Salary AS FN_Sal, F.Friend_ID AS F_ID 
     FROM Friends F JOIN Packages P ON F.Friend_ID = P.ID) R
ON L.NID = R.N_ID

我猜我的查询有问题。这绝对不是一个优雅的解决方案,但我只是在尝试一个想法。任何意见都会非常有帮助,在此先感谢。

【问题讨论】:

  • 因为问题有点朦胧,能否提供一张表格,说明你想要达到的效果?
  • 好的,我将对问题进行编辑。请参阅@Giannis,我正在尝试将此查询用作另一个查询中的子查询。因此我不想使用 ORDER BY 子句。这是针对 Hackerrank 问题的。

标签: sql sql-server join


【解决方案1】:

您必须将Students 加入FriendsPackages 的2 个副本。
第一份Packages返回学生工资,第二份返回朋友工资:

SELECT s.Name
FROM Students s
INNER JOIN Friends f ON f.ID = s.ID
INNER JOIN Packages ps ON ps.ID = s.ID
INNER JOIN Packages pf ON pf.ID = f.Friend_ID
WHERE pf.Salary > ps.Salary
ORDER BY pf.Salary

请参阅demo
结果:

> | Name     |
> | :------- |
> | Samantha |
> | Julia    |
> | Scarlet  |

【讨论】:

    【解决方案2】:

    这是问题的一个答案:

    DECLARE @Friends TABLE (ID int, Friend_ID INT);
    DECLARE @Students TABLE (ID int, Name VARCHAR(100));
    DECLARE @Packages TABLE (ID int, Salary DECIMAL(4,2));
    
    INSERT INTO @Friends SELECT ID,Friend_ID FROM (VALUES(1,2),(2,3),(3,4),(4,1)) Friends(ID,Friend_ID);
    INSERT INTO @Students SELECT ID,[Name] FROM (VALUES(1,'Ashley'),(2,'Samantha'),(3,'Julia'),(4,'Scarlet')) Students(ID,[Name]);
    INSERT INTO @Packages SELECT ID,Salary FROM (VALUES (1,15.20),(2,10.06),(3,11.55),(4,12.12)) Packages(ID,Salary);
    
    WITH StudentPackage AS (
        SELECT
            Student.ID,
            Student.[Name] StudentName,
            Packages.Salary,
            BestFriend.Friend_ID 
        FROM @Students Student
        JOIN @Packages Packages
        ON Student.ID = Packages.ID
        JOIN @Friends BestFriend
        ON Student.ID = BestFriend.ID
    )
    SELECT
        Student.StudentName
    FROM StudentPackage Student
    JOIN StudentPackage BestFriend
    ON Student.Friend_ID = BestFriend.ID AND BestFriend.Salary > Student.Salary
    ORDER BY BestFriend.Salary
    

    【讨论】:

    • 所以想法是做一个CT exp。然后与上一个表(在 CTE 中使用)进行连接?
    • 我认为这是解决您问题的一种方法,但如果您发布整个问题会更容易。
    • hackerrank.com/challenges/placements/problem?isFullScreen=false 这是问题所在。我知道我的方法并不简单,而是有点太复杂了。但我还是想看看有没有可能。
    • 我已经更新了我的答案。我认为这是解决问题的一种方法。
    • 嘿@Andreas,谢谢!这比我的方法更简单。
    【解决方案3】:

    您是否考虑过使用 Order by 子句。应该可以的。

    【讨论】:

    • 我使用了 Order By 子句,但我想使用其他东西,因为我想在子查询中使用它。
    • 更多评论
    【解决方案4】:

    感谢您的所有投入!他们是正确的,我看到我把这么简单的问题复杂化了是多么不必要。

    根据我的逻辑,这是我试图实现的解决方案:

    WITH 
        CTE (N_ID,N_Name,N_Salary,FID) AS
        (SELECT S.ID AS N_ID, S.Name AS N_Name, P.Salary AS N_Salary, F.Friend_ID AS FID 
         FROM Students S JOIN Friends F
         ON S.ID = F.ID JOIN Packages P 
         ON S.ID = P.ID)
         
         
    SELECT L.N_Name
    FROM CTE L
    JOIN 
        (SELECT F.ID AS N_ID, P.Salary AS FN_Sal, F.Friend_ID AS F_ID 
         FROM Friends F JOIN Packages P ON F.Friend_ID = P.ID) R
    ON L.N_ID = R.N_ID
    WHERE R.FN_Sal > L.N_Salary
    ORDER BY R.FN_Sal;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 2012-09-07
      • 2023-04-01
      • 2011-09-30
      • 2012-08-27
      相关资源
      最近更新 更多