SQL Server:从子查询中调出列

Posted

技术标签:

【中文标题】SQL Server:从子查询中调出列【英文标题】:SQL Server : bring up columns from a sub query 【发布时间】:2014-09-17 14:57:01 【问题描述】:

我非常坚持这一点(SQL Server 2008 R2)。

我有一个名为 orders 的表:

Orders:

orderid  details
--------------------
1        my order

然后我有一个自定义字段表。

Custom_fields:

rel_orderid  fieldname  numericvalue  textvalue  datevalue
-----------------------------------------------------------
1            auction    0             My auction
1            date       0                        01/01/2014

我正在努力

orderid   details   auction     date (on one row)
-------------------------------------------------
1         my order  my auction  01/01/2014

希望这是有道理的,但我不知道如何将 custom_fields 表包装到列标题中,然后只有 1 个值(可以是文本值或日期等 - 只有 1 个有数据)

拍卖和日期并从字段名列读取,然后是每个字段的值。

【问题讨论】:

【参考方案1】:

您可以为此使用maxcase

select o.orderid, 
       o.details, 
       max(case when c.fieldname = 'auction' then textvalue end) auction,
       max(case when c.fieldname = 'date ' then datevalue end) datevalue 
from orders o
       join custom_fields c on o.orderid = c.rel_orderid  
group by o.orderid

【讨论】:

【参考方案2】:

在这种情况下您可以 PIVOT。

select orderid,
       details,
       [auction],  
       [date]
FROM
(
      select rel_orderid as orderid,
             o.details, 
             fieldname, 
             (case when fieldname = 'auction'
                     then textvalue
                     when fieldname ='date' 
                     then cast(datevalue AS varchar(128))
                     end) value
       FROM custom_fields
       INNER JOIN orders o
       on o.orderid = rel_orderid
) As OrderDetails 
PIVOT
(
        max(value) 
        for fieldname in ([auction],[date])
) pvt

【讨论】:

【参考方案3】:

如果你想避免聚合,你可以使用连接来做到这一点:

select o.orderid, o.details, a.textvalue as auction, d.datevalue as dateval
from orders o left join
     custom_fields a
     on a.rel_orderid = o.orderid and a.fieldname = 'auction' left join
     custom_fields d
     on d.rel_orderid = o.orderid and d.fieldname = 'date';

即使没有匹配,left join 也会给出一个值 (NULL)。

【讨论】:

以上是关于SQL Server:从子查询中调出列的主要内容,如果未能解决你的问题,请参考以下文章

是否可以从子查询中添加 SQL 别名?

从子查询 SQL 中选择最大数据,但它显示来自子查询的所有结果

从子查询中删除多行的SQL语法错误

SQL服务器从子查询中多次计数的总和

如何从子查询中获取 ResultSet 的别名?

SQL练习 高级子查询