通过同一个表的多个外键排序

时间:2013-03-05 22:01:22

标签: tsql

很抱歉,如果这是一个n00b问题。我不是T-SQL专家,但我有一个工作的理解。我打算尽力说清楚,但开始时有点混乱。

问题

我有两张桌子。表A表示项目,表B表示项目之间的关系。

表A:ItemID,Name,......

表B:ParentID,ThisID,ChildID

我面临的问题是表B中的所有三个ID都指向表A中的主键,但是我需要按每个关系角色的组中的A.Name排序结果(如果这有意义)。

所以,如果表A有:

1 ItemZ
2 ItemA
3 ItemD
4 ItemX
5 ItemT

和表B有:

1 3 5
1 2 4
1 3 4
1 2 3
2 4 5
1 2 5

我希望返回的结果按父项的名称分组,然后是“this”项目名称,然后是子项目的名称......在这种情况下:

2(A) 4(X) 5(T)
1(Z) 2(A) 3(D)
1(Z) 2(A) 5(T)
1(Z) 2(A) 4(X)
1(Z) 3(D) 5(T)
1(Z) 3(D) 4(X)

问题

如何在保持分组的同时在同一字段(表A.Name)上使用ORDER BY

注意

我读过这个:SQL Ordering by Date but Maintain Foreign Key Groupings但我不认为答案符合我的问题。我在这里和谷歌上查找了我的问题,但我找不到重复的内容。

1 个答案:

答案 0 :(得分:1)

您需要将表连接在一起,以便将表B中的ID与表A中的名称相关联。由于表B中有三个不同的ID链接到表A,因此您需要三次加入表A。为了保持组织有序,我建议使用A_ParentA_ChildA_This等别名。这是一个应按预期排序的示例:

select
  B.ParentID, B.ThisID, B.ChildID
from
  TableB B
join
  TableA A_Parent on A_Parent.ItemID = B.ParentID
join
  TableA A_This on A_This.ItemID = B.ThisID
join
  TableA A_Child on A_Child.ItemID = B.ChildID
order by
  A_Parent.Name, A_This.Name, A_Child.Name

示例输出(DEMO):

PARENTID | THISID | CHILDID
-----------------------
  2      |  4     |  5
  1      |  2     |  3
  1      |  2     |  5
  1      |  2     |  4
  1      |  3     |  5
  1      |  3     |  4