T-SQL: SQL для получения взаимных записей из одной таблицы - PullRequest
2 голосов
/ 29 августа 2011

Это довольно сложно описать. У меня есть таблица с двумя полями: Col1, Col2 со следующими данными:

Col1, Col2
  1    10
  1    11
  1    12
  10   1
  11   1
  13   1

Значения в Col1 могут действовать как значения внешнего ключа в Col2. Я хочу найти все строки для данного значения в Col1, где значение в Col2 появляется в Col1, но где его значение Col2 также является заданным значением. Так, например, если я ищу значение 1 в Col1, возвращаются следующие строки:

Col1, Col2
  1    10
  1    11
  10   1
  11   1

Строка с Col1, установленным в 13, не будет возвращена, потому что она не отображается в Col2, где Col1 установлено в 1.

Созданные мной работы sql:

Select T1.*
From Table1 T1
Inner Join Table1 T2 On T1.Col2 = T2.Col1
Where (Exists(Select * From Table1 T3 Where (T2.Col1 = T3.Col1) And (T3.Col2 = T1.Col1)))
And (T1.Col1 = 1)

Возвращает дубликаты строк. Я всегда могу добавить ключевое слово DISTINCT, и это позволит удалить дубликаты. Мой вопрос заключается в том, является ли мой sql действительно правильный способ выбора записей и можно ли это сделать без ключевого слова DISTINCT.

Ответы [ 2 ]

1 голос
/ 29 августа 2011

Я думаю, что это может делать то, что вы хотите:

SELECT T1.*
FROM Table1 T1
JOIN Table1 T2 ON (T1.Col2 = T2.Col1) AND (T1.Col1 = T2.Col2)
WHERE T1.Col1 = 1
0 голосов
/ 29 августа 2011

Я думаю, вы можете сбросить JOIN и просто использовать EXISTS

SELECT  T1.*
FROM    Table1 T1
WHERE   1 IN ( T1.Col1, T1.Col2 )
        AND ( EXISTS ( SELECT   *
                       FROM     Table1 T2
                       WHERE    ( T2.Col1 = T1.Col2
                                  AND T2.Col2 = T1.Col1
                                ) ) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...