SQL Server 2008 R2: найдите строки, в которых значение столбца2 присутствует в столбце 1

Я хочу найти записи, в которых запись col2 присутствует в CREATE TABLE Test_Table ( Col1 int , Col2 int ); ,

Таблица:

INSERT INTO Test_Table VALUES(111,112),
                              (112,113),
                              (114,115),
                              (116,117),
                              (117,118),
                              (118,119);

Записи:

Col1    Col2
-------------
111     112
112     113
116     117
117     118
118     119

Ожидаемый результат:

114,115

Примечание. Запись 115не отменяется, потому что col1ее нет col1.

Моя попытка:

WITH CTE1
AS
(
    SELECT Col1, Col2
    FROM Test_Table
),
CTE2
AS
(
    SELECT t.Col1, t.Col2
    FROM Test_Table t
    INNER JOIN CTE1 s1
    ON s1.Col2 = t.Col1
    OR s1.Col2 = t.Col2
)
SELECT DISTINCT * FROM CTE2;

Но все записи.

sql,sql-server,sql-server-2008-r2,

3

Ответов: 6


3 принят

Это может также работать

select t.* 
from   Test_Table t
where  exists (select 1
               from   test_table t2
               where  t2.col1 = t.col2 or t2.Col2 = t.Col1
              )

3

Я думаю, это то, что вы хотите.

select t.*
from #test_table t
where exists (select 1
              from #test_table t2
              where t2.col1 = t.col2
             )
   or exists (select 1
              from #test_table t3
              where t3.col2 = t.col1
             );

2

Я думаю, вы просто хотите exists:

select tt.*
from test_table tt
where exists (select 1
              from test_table tt2
              where tt2.col1 = tt.col2
             );

2

Использование CROSS JOIN:

select t1.* from test_table t1 CROSS JOIN test_table t2
on t1.col1 = t2.col2 
UNION 
select t1.* from test_table t1 CROSS JOIN test_table t2
on t1.col2 = t2.col1 

0

Основываясь на ваших комментариях, я подозреваю, что вы хотите, чтобы либо col1 / col2 существовал в другой строке, либо col1 / col2

select tt.*
from test_table tt
where exists (select 1
              from test_table tt2
              where   -- Ensure not same row
                    (tt2.col1 <> tt.col1 or tt2.col2 <> tt.col2)
                and -- Ensure at least one match
                    (tt2.col1 = tt.col1 or tt2.col1 = tt.col2 or tt2.col2 = tt.col1 or tt2.col2 = tt.col2)
             );
SQL, SQL-сервер, SQL-сервер-2008-r2,
Похожие вопросы