如何通过未选择的字段对查询进行排序

时间:2019-04-24 13:19:14

标签: sql-server stored-procedures

我是SQL查询和存储过程的nwbie,我尝试订购一个有3个内部联接的查询,但是出现此错误:

  如果指定了SELECT DISTINCT,则

ORDER BY项目必须出现在选择列表中。

这是我尝试过的查询代码:

SELECT DISTINCT
    P.ProductId,
    PID.IndexId
FROM
    Products AS P
INNER JOIN 
    #ProductIds AS PID ON P.ProductId = PID.ProductId
INNER JOIN 
    ProductStores AS PS ON P.ProductId = PS.ProductId
ORDER BY 
    CASE PS.Status 
       WHEN 1 THEN 1 
       ELSE 2 
    END 
    OFFSET (@PageIndex * @PageSize) ROWS 
    FETCH NEXT (@PageSize) ROWS ONLY;

当我删除distinct关键字时,这些行被重复很多次

2 个答案:

答案 0 :(得分:1)

尝试一下...

SELECT * FROM (
    SELECT DISTINCT 
    P.ProductId, 
    PID.IndexId, 
    (CASE tb.Status WHEN 1 THEN 1 ELSE 2 END) AS Status
FROM Products AS P 
    INNER JOIN #ProductIds AS PID ON P.ProductId = PID.ProductId 
    INNER JOIN ProductStores AS PS ON P.ProductId = PS.ProductId ) as tb
ORDER BY tb.Status OFFSET (@PageIndex * @PageSize) ROWS FETCH NEXT (@PageSize) ROWS ONLY;

因为order by语句在select语句之后执行。并且当不同的两列可能包含差异状态时。这意味着那两排东西。第一行1(ProductId),2(IndexId),1(状态)和第二行1(ProductId),2(IndexId),2(状态)。当您获得第一个不同的两列时。它仅返回1行,但返回哪个状态?但是您先添加状态列,然后它才能分别知道状态列。

答案 1 :(得分:1)

您的结果仅对显示来自Products#ProductIds的字段感兴趣-(ProductIdIndexId)-但是,您正在加入第三个表试图按({ProductStores)排序。

如果您有一个{100}与之关联的ProductId,那么ProductStores会向您显示一个 DISTINCT 不论ProductId字段。

最好问你-您想要什么答案?

我猜您想先列出与它们关联的ProductStores.Status产品。但是,似乎没有什么可阻止产品与两者关联的Status = 1商店和Status = 1商店。这就是为什么在这种情况下,SQL无法为您提供答案的原因-您想要每个产品一行。

要按状态订购,您需要输出它。但是,接下来,您将为产品,索引,状态的每种组合获得一行。

@mimamiq的答案可能不需要外部Status = 0 ...

SELECT

但是请注意-如果您想要每个产品/产品ID组合一行-那么这将行不通(除非您对数据库有其他限制,但我们不这样做)不知道)。