SQL Server - получите разные идентификаторы из 2 столбцов и сохраните их в одной таблице - PullRequest
0 голосов
/ 12 июня 2018

У меня есть следующая таблица

user_one    user_two
20151844    2016000
20151844    2017000
2018000     20151844
20151844    20151025
20151036    20151844

Генерируется по следующему запросу

 select * from [dbo].[Contact] C
 where C.user_one=20151844 or C.user_two=20151844

Я хочу получить следующий результат, исключая текущий идентификатор пользователя 20151844

contact_Ids
2016000
2017000
2018000
20151025
20151036

Каков наилучший оптимизированный способ сделать это?зная, что я хочу присоединиться к идентификаторам, чтобы получить имя контакта из таблицы пользователя.

Вот мои таблицы:

Contact 
user_one (int FK User.user_id), user_two (int FK User.user_id), status, action_user (int)

User
user_id (int PK), name , ... 

Ответы [ 4 ]

0 голосов
/ 12 июня 2018

Используйте UNION и INNER JOIN:

SELECT c.[contact_Ids],
       u.[name]
       FROM (SELECT [user_one] [contact_Ids]
                    FROM [Contact]
                    WHERE [user_one] <> 20151844
                          AND [user_two] = 20151844
             UNION
             SELECT [user_two] [contact_Ids]
                    FROM [Contact]
                    WHERE [user_two] <> 20151844
                          AND [user_one] = 20151844) c
             INNER JOIN [User] u
                        ON u.[user_id] = c.[contact_Ids]
       ORDER BY c.[contact_Ids];
0 голосов
/ 12 июня 2018

Операции над множествами Union и except работают лучше всего.

;with ids as (
select user_one id from contact
union
select user_two from contact
except
select 20151844
)
select u.*
from [user] u 
inner join ids on u.user_id = ids.id
0 голосов
/ 12 июня 2018

другой вариант: iif

select iif(C.user_one=20151844,C.user_two,C.user_one) as contact_IDs
from [dbo].[Contact] C
where C.user_one=20151844 or C.user_two=20151844
0 голосов
/ 12 июня 2018

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

select tt.contact_Ids
from table t cross apply ( 
         values (user_one), (user_two) 
    ) tt (contact_Ids)
group by tt.contact_Ids
having count(*) = 1;
...