TSQL问题(MS Sql Server 2012) 我有一个表格,代表服务器的行。每个服务器都有一个用于故障转移的备份服务器,因此我表中的每一行都有一列服务器ID(密钥)和一列代表指定备份服务器的密钥。
我已经针对此表编写了一个查找不匹配行的查询,并且该查询每行返回三个键值。每列是一个键值,表示参与不匹配的服务器。在大多数情况下,我们将看到每个不匹配的三个服务器 - 其中服务器1显示它的对是服务器2,而服务器2具有与不同服务器(服务器3)的配对。
目前,我已成功找到不匹配,如以下示例结果所示:
12345, 23456, 34567
23424, 89234, 43453
第一列是主服务器ID,第二列是其次要的当前密钥,第三列是辅助行显示其主要匹配的值。当第三列与第一列不同时,它是不匹配的,我想详细查看所有这些行。
要进行该检查,我想使用查询结果查找后续选择中不匹配的行的ID,以获取代码所代表的每个完整记录的详细信息,例如< / p>
select * from foo where foo.id in (12345, 23456, 34567, ...)
但是,我不知道我想要的ID,所以它将采取以下形式:
select * from foo where foo.id in (subquery)
由于想要将查询结果用作子查询中的集合,子查询需要每行返回一个值而不是三个(我想查看所有三行标识,作为我的使用案例是查找有数据质量问题的记录)
如何轻松地将结果从列转换为行?我没有要进行聚合(因此转向/取消转换) - 但是对于选择列表,我需要子查询返回不同的行,每行一个值而不是每行三个值。
我知道我可以做一个大老联盟,重复相同的复杂自联接来找到我需要的三个列,一次一列,称它们为相同的值。返回三个值的子查询已经有点昂贵,所以我想尽可能避免这种情况。
似乎我需要做的就是将列转换为行 - 无需计算。怎么样?
答案 0 :(得分:0)
Tab Alleman的提示让我得到了我需要的答案 - Cross Apply使您能够重新格式化结果而无需聚合。
为简单起见,我的详细子查询可以压缩为:
with foobar (code1, code2, code3)
as
(
very complicated query that returns my results goes here
)
select * from details where code in (select distinct u.code from foobar t
cross apply
(
select code1
union all
select code2
union all
select code3
) u code )