首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文字将列转置为单列行

问文字将列转置为单列行
EN

Stack Overflow用户
提问于 2016-02-04 05:30:25
回答 1查看 209关注 0票数 0

TSQL问题(MS Sql Server 2012)我有一个表,其中包含表示服务器的行。每台服务器都有一个用于故障转移的备份服务器,因此我的表中的每一行都有一个用于服务器ID (键)的列和一个表示作为指定备份的服务器键的列。

我已经针对这个表编写了一个查询,该查询查找不匹配的行,该查询每行返回三个键值。每列都是一个键值,表示参与不匹配的服务器。在大多数情况下,我们将看到每个不匹配的三个服务器-其中服务器1显示它的配对是服务器2,而服务器2有一个配对到不同的服务器(服务器3)。

目前,我正在成功地查找不匹配,如以下示例结果所示:

代码语言:javascript
复制
    12345, 23456, 34567
    23424, 89234, 43453

第一列是主服务器ID,第二列是次要服务器的当前键,第三列是次要服务器的行显示的主要匹配值。当第三列与第一列不同时,它是不匹配的,我想详细查看所有这些行。

为了进行检查,我希望使用查询的结果来获得代码所表示的每条完整记录的详细信息,该查询查找在后续select中不匹配的行的ID

代码语言:javascript
复制
    select * from foo where foo.id in (12345, 23456, 34567, ...)

但是,我不知道我想要的ID,所以它将采用以下形式:

代码语言:javascript
复制
    select * from foo where foo.id in (subquery)

由于希望在子查询中使用查询结果作为集合,子查询需要每行返回一个值,而不是三个值(我希望查看识别的所有三行,因为我的用例是查找有数据质量问题的记录)

如何轻松地将结果从列转换为行?我不需要执行聚合操作(因此pivot/unpivot似乎不存在)-但是对于选择列表,我需要子查询返回不同的行,每行返回一个值,而不是每行返回三个值。

我知道我可以做一个大的老联合,重复同样复杂的自连接来找到我需要的三列,一次一列,称它们为相同的值。返回三个值的子查询已经有些开销了,所以我想尽可能避免这种情况。

似乎我所需要做的就是将列转置为行-没有计算要做。多么?

EN

回答 1

Stack Overflow用户

发布于 2016-02-04 06:22:32

Tab Alleman的提示让我找到了所需的答案-- Cross Apply使您能够在不聚合的情况下重新格式化结果。

为简单起见,我的detail子查询可以压缩为:

代码语言:javascript
复制
    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 )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35188111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档