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_id iifCASE WHEN 语句的快捷方式,因此无论哪种方式都不会影响性能。真正的速度是列是否被索引【参考方案2】:

使用UNIONINNER 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】:

设置操作Unionexcept 效果最好。

;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 并存储在一个列表中的主要内容,如果未能解决你的问题,请参考以下文章

如何从 2 个不同的 SQL Server 获取数据

在 SQL Server 中使用 value() 从 xml 列获取多条记录

sql 如果您需要将数据从一个SQL Server数据库(或表)迁移到另一个不同的列大小的位置

在SQL Server中使用value()从xml列获取多个记录

如何获取在 SQL Server 内部数据库的不同表中重复的列[重复]

SQL Server:从查询返回的动态列