0

我正在尝试创建一个查询,该查询返回结果集中子查询的结果。

这是我正在使用的表格:

Orders       OrderDetails     
-------      -----------     
orderId      orderDetailId         
(other data) orderId
             productName     

我想获取每个订单的前两个订单详细信息(大多数订单只有一个或两个详细信息)。这是所需结果集的示例:

orderId   (other order data)   productName1   productName2
-------   ------------------   ------------   ------------
1         (other order data)   apple          grape
2         (other order data)   orange         banana
3         (other order data)   apple          orange

这是我到目前为止所尝试的:

SELECT o.orderid, 
       Max(CASE WHEN detail = 1 THEN oi.productname END) AS ProductName1, 
       Max(CASE WHEN detail = 2 THEN oi.productname END) AS ProductName2 
FROM orders AS o 
    OUTER apply (SELECT TOP 2 oi.*, 
                     Row_number() OVER (ORDER BY orderdetailid) AS detail 
                FROM orderdetails AS oi 
                WHERE oi.orderid = o.orderid) AS oi 
GROUP BY o.orderid 

我在托管电子商务解决方案的自定义报告模块中执行此操作,并收到以下无用的语法错误:SQL 错误:'(' 附近的语法不正确。

不幸的是,我不知道我使用的是什么版本的 SQL Server。客户支持一无所知,选择@@Version 不起作用。

请注意,即使错误消息按名称引用该函数,似乎也没有正确支持 row_number() 函数。

谢谢您的帮助!

4

2 回答 2

0

如果您只是选择orderid和产品,则根本不需要加入:

select orderid, productcode
from (SELECT oi.orderid, oi.productcode,
             row_number() over (partition by oi.orderid order by oi.orderdetailid) as seqnum
      FROM orderdetails oi
     ) oi
where seqnum = 1;

row_number()如果不起作用,这可能无法解决问题,但它简化了查询。您也可以使用以下min()方法执行此操作:

select orderid, productcode
from orderdetails oi
where oi.orderdetailid in (select min(orderdetailid) from orderdetails group by orderid);
于 2013-08-24T14:48:15.590 回答
0

这是不使用交叉应用的替代方法。您的排名是正确的,但我按顺序添加了一个分区。

SELECT 
*
FROM
(
    SELECT
        o.orderid,
        ProductName=oi.productcode, 
        RowNumber=ROW_NUMBER() OVER (PARTITION BY o.orderid ORDER BY oi.orderdetailid) 
    FROM
        orders as o
        INNER JOIN orderdetailid oi ON oi.orderid=o.orderid
)AS X
WHERE
    RowNumber=1

不使用 row_number

SELECT
    orderdetails.*
    Q1.* 
FROM
(   
    SELECT 
        o.*, 
        FirstOrderDetailID=(SELECT MIN(orderdetails.orderdetailsid) FROM orderdetails WHERE orderid=o.orderid)
    FROM
        orders o    
)AS Q1     
LEFT OUTER JOIN orderdetails oi ON oi.orderdetailsid=Q1.FirstOrderDetailID     
于 2013-08-24T13:41:09.140 回答