2012-01-25 6 views
0

У меня есть таблица, которая сохраняет возможные состояния других таблиц (сущностей). Но теперь мне нужно найти эквивалентность состояний между двумя объектами. Структура таблицы что-то вроде этогоSQL select column эквивалентность

ID TableID StateValue StateDefinition StateDescription 
================================================================ 
1 1   1   Created   Just created 
2 1   2   Dropped   Just Dropped 
3 2   1   Created   Just Created 
4 2   2   Aproved   Passed the revision 
5 2   3   Dropped   Just dropped 

Я хочу, чтобы получить эквивалент (сравнивая текст состояния), который в итоге получить это:

TableID1  StateValue1  TableID2  StateValue2 StateDefinition 
    ============================================================================= 
    1   1     2    1    Created 
    1   2     2    3    Dropped 

Мой вопрос, как это может быть сделано? ?

ответ

2
select t1.TableID as TableID1, 
    t1.StateValue as StateValue1, 
    t2.TableID as TableID2, 
    t2.StateValue as StateValue2, 
    t1.StateDefinition 
from MyTable t1 
inner join MyTable t2 on t1.TableID = 1 and t2.TableID = 2 
where t1.StateValue = t2.StateValue 
    and t1.StateDefinition = t2.StateDefinition 
+0

Фиксированный 't1.TableID = 1' и' t2.TableID = 2' части не обобщают. –

+0

Действительно ли это возвращает результат, о котором спрашивал ОП? Соединение t1.StateValue = t2.Statevalue означает, что вторая строка в его результирующем наборе не возвращается. –

+0

@NWest Вы правы, я этого не заметил. Я думаю, что предложение WHERE должно быть: 'где t1.StateDefinition = t2.StateDefinition'. Я принял * «эквивалентность состояний» *, чтобы они были равны. – RedFilter

3

Сделайте самостоятельное соединение на столе.

Общий случай может выглядеть следующим образом:

SELECT A.TableID as TableId1, 
     A.StateValue as StateValue1, 
     B.TableId as TableId2, 
     B.StateValue as StateValue2, 
     A.StateDefinition 
FROM 
    Table A 
INNER JOIN Table B 
    ON (A.TableId <> B.TableId and A.StateDefiniton = B.StateDefinition)