Sql 如何根据另一个表中的索引序列对列中的名称进行排序?

Sql 如何根据另一个表中的索引序列对列中的名称进行排序?,sql,sql-server,join,Sql,Sql Server,Join,我有三张桌子,朋友和学生,他们都有一个ID列。但是在Friends表中,还有一列名为Friend\u ID。我想按照Friend\u ID的排序方式对Friends中的Name列重新排序。可能吗 这是为了解决问题- 注意:我想在不使用ORDERBY子句的情况下使用它,因为这将是一个子查询 我在SQL Server中的查询 WITH CTE (NID,N_Name,N_Salary,FID) AS (SELECT S.ID AS NID, S.Name AS N_Name, P.

我有三张桌子,朋友和学生,他们都有一个ID列。但是在Friends表中,还有一列名为Friend\u ID。我想按照Friend\u ID的排序方式对Friends中的Name列重新排序。可能吗

这是为了解决问题-

注意:我想在不使用ORDERBY子句的情况下使用它,因为这将是一个子查询

我在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


我想我的问题出了点问题。这绝对不是一个优雅的解决方案,但我只是在尝试一个想法。任何输入都会非常有用,提前谢谢。

您考虑过使用Order by子句吗。这应该行得通。

这是问题的一个答案:

声明@Friends表ID int,Friends\u ID int; 声明@Students表ID int,名称VARCHAR100; 声明@Packages表ID int,工资小数点4,2; 在@Friends中插入SELECT ID,Friends\u ID的值1,2,2,3,3,4,4,1 FriendsID,Friends\u ID; 在@Students中插入[Name],从值1、'Ashley',2、'Samantha',3、'Julia',4、'Scarlet'StudentsID、[Name]中选择ID; 在@Packages中插入值1,15.20,2,10.06,3,11.55,4,12.12 PackagesID,Salary中的ID,Salary; 以StudentPackage为例 选择 学生证, 学生。[姓名]学生姓名, 包,工资,, 最好的朋友 来自@Students学生 加入@Packages包 ON Student.ID=Packages.ID 加入@Friends BestFriend 关于Student.ID=BestFriend.ID 选择 Student.StudentName 来自StudentPackage学生 加入StudentPackage最佳朋友 关于Student.Friend\u ID=BestFriend.ID和BestFriend.Salary>Student.Salary 由好友订购。薪水 你必须加入学生的朋友和2个包的副本。 第一份套餐将返还学生的工资,第二份套餐将返还朋友的工资:

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
看。 结果:


感谢您的所有投入!他们是正确的,我明白我把这样一个简单的问题复杂化是多么不必要

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

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;

因为这个问题有点模糊,你能提供一个你想要实现的表格吗?好的,我将对这个问题进行编辑。请参阅@Giannis,我正在尝试将此查询用作另一个查询中的子查询。因此,我不想使用ORDERBY子句。这是针对Hackerrank问题的。我使用了Order By子句,但我想使用其他一些东西,因为我想在子查询中使用它。更多的是注释。因此,想法是创建一个CT exp,然后与CTE中使用的上一个表进行连接?我认为这是解决问题的一种方法,但如果您发布整个问题问题是。我知道我的方法不简单,有点太复杂了。但我还是想看看这是否可行。我已经更新了我的答案。我认为这是一个解决问题的办法。嘿@Andreas,谢谢!这个方法比我的方法简单。
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;