2013-03-05 4 views
1

Извините, если это вопрос n00b. Я не эксперт по T-SQL, но у меня есть рабочее понимание. Я попытаюсь сделать это понятным, но с самого начала это сбивает с толку.Порядок с несколькими внешними ключами в ту же таблицу

Задача

У меня есть две таблицы. Таблица A представляет собой элемент, а таблица B представляет отношения между элементами.

Таблица A: ItemID, имя, ...

Таблица B: ParentID, ThisID, ChildID

Проблема я столкнулся в том, что все три идентификаторы в таблице B, указывают на первичные ключи в Таблица A, но мне нужно заказывать результаты по A.Name в группах для каждой роли отношений (если это имеет смысл).

Таким образом, если таблица А имеет:

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 

Я хотел бы результаты вернулся группировать по имени родительского элемента, то «это» имя элемента, затем имя дочернего элемента ... в этом сценарии:

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) 

вопросе

Как я могу использовать ORDER BY в том же поле (Таблица A.Name), сохраняя при этом группировку?

Примечание

Я прочитал это: SQL Ordering by Date but Maintain Foreign Key Groupings, но я не думаю, что ответ на мой вопрос подходит. Я искал свой вопрос здесь и в Google, но я не могу найти дубликат.

ответ

1

Вам необходимо объединить таблицы, чтобы вы могли связать ID в таблице B с именем в таблице A. Поскольку у вас есть три разных идентификатора в таблице B, которые ссылаются на таблицу A, вам нужно будет вступить в таблицу A три раза. Чтобы все было организовано, я рекомендую использовать псевдонимы, такие как A_Parent, A_Child, A_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 
+0

'ORDER BY A_Parent.Name, A_This.Name, A_Child.Name' было то, что мне было нужно. Благодаря! –