TSQL问题(MS Sql Server 2012)我有一个表,其中包含表示服务器的行。每台服务器都有一个用于故障转移的备份服务器,因此我的表中的每一行都有一个用于服务器ID (键)的列和一个表示作为指定备份的服务器键的列。
我已经针对这个表编写了一个查询,该查询查找不匹配的行,该查询每行返回三个键值。每列都是一个键值,表示参与不匹配的服务器。在大多数情况下,我们将看到每个不匹配的三个服务器-其中服务器1显示它的配对是服务器2,而服务器2有一个配对到不同的服务器(服务器3)。
目前,我正在成功地查找不匹配,如以下示例结果所示:
12345, 23456, 34567
23424, 89234, 43453第一列是主服务器ID,第二列是次要服务器的当前键,第三列是次要服务器的行显示的主要匹配值。当第三列与第一列不同时,它是不匹配的,我想详细查看所有这些行。
为了进行检查,我希望使用查询的结果来获得代码所表示的每条完整记录的详细信息,该查询查找在后续select中不匹配的行的ID
select * from foo where foo.id in (12345, 23456, 34567, ...)但是,我不知道我想要的ID,所以它将采用以下形式:
select * from foo where foo.id in (subquery)由于希望在子查询中使用查询结果作为集合,子查询需要每行返回一个值,而不是三个值(我希望查看识别的所有三行,因为我的用例是查找有数据质量问题的记录)
如何轻松地将结果从列转换为行?我不需要执行聚合操作(因此pivot/unpivot似乎不存在)-但是对于选择列表,我需要子查询返回不同的行,每行返回一个值,而不是每行返回三个值。
我知道我可以做一个大的老联合,重复同样复杂的自连接来找到我需要的三列,一次一列,称它们为相同的值。返回三个值的子查询已经有些开销了,所以我想尽可能避免这种情况。
似乎我所需要做的就是将列转置为行-没有计算要做。多么?
发布于 2016-02-04 06:22:32
Tab Alleman的提示让我找到了所需的答案-- Cross Apply使您能够在不聚合的情况下重新格式化结果。
为简单起见,我的detail子查询可以压缩为:
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 )https://stackoverflow.com/questions/35188111
复制相似问题