SQL Server - 从 2 列获取不同的 ID 并存储在一个列表中
Posted
技术标签:
【中文标题】SQL Server - 从 2 列获取不同的 ID 并存储在一个列表中【英文标题】:SQL Server - Get Distinct Ids from 2 column and store in one coulmn table 【发布时间】:2018-06-12 19:38:45 【问题描述】:我有下表
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
我想得到以下结果,不包括当前用户ID 20151844
contact_Ids
2016000
2017000
2018000
20151025
20151036
实现它的最佳优化方法是什么?知道我想加入 id 以从用户表中获取联系人姓名。
这是我的桌子:
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 , ...
【问题讨论】:
【参考方案1】:另一个选项: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
【讨论】:
工作正常,但我需要询问选项是否通过联合检索它们会更快,因为我知道我在您的查询中添加了内部联接 select U.first_name from [dbo].[User] U inner join (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 ) and C.[status] = '1' ) C on C.contact_IDs = U.user_idiif
是CASE WHEN
语句的快捷方式,因此无论哪种方式都不会影响性能。真正的速度是列是否被索引【参考方案2】:
使用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];
【讨论】:
【参考方案3】:使用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;
【讨论】:
【参考方案4】:设置操作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
【讨论】:
以上是关于SQL Server - 从 2 列获取不同的 ID 并存储在一个列表中的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 中使用 value() 从 xml 列获取多条记录
sql 如果您需要将数据从一个SQL Server数据库(或表)迁移到另一个不同的列大小的位置
在SQL Server中使用value()从xml列获取多个记录