【问题标题】:sql order by inside a subquerysql order by 在子查询中
【发布时间】:2014-12-15 14:36:14
【问题描述】:

我有这个问题:

SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY CASE WHEN ISNUMERIC(dtLu.sLu) = 1 THEN CONVERT(INT, dtLu.sLu) ELSE 9999999 END asc, dtLu.sLu) as row, 
dtLu.*, dtLuDerived.cCll, dtMtrDerived.cMtrCll, dtMtrDerived.cMtrCllIn, dtMtrDerived.cMtrCllOut FROM dtLu
LEFT OUTER JOIN (
    SELECT pLu, COUNT(pLu) AS cCll
    FROM dtCll
    GROUP BY pLu) 
    AS dtLuDerived ON dtLu.pLu = dtLuDerived.pLu
LEFT OUTER JOIN (
    SELECT dtCll.pLu, SUM(cMtrCll) AS cMtrCll, SUM(cMtrCllIn) AS cMtrCllIn, SUM(cMtrCllOut) AS cMtrCllOut
    FROM dtMtrCll
    INNER JOIN dtCll on dtCll.pCll = dtMtrCll.pCll
    WHERE dtCll.pWhr IN (SELECT DISTINCT pWhr FROM dtUserWhr WHERE pUser = 5)
    GROUP BY dtCll.pLu) 
    AS dtMtrDerived ON dtLu.pLu = dtMtrDerived.pLu
INNER JOIN dtLct on dtLct.pLct = dtLu.pLct
WHERE dtLu.pLu > 0 AND dtLct.pLctAsl IN (select pAsl from dtAsl where pAslUnt = 1)
-- this is the ORDER I need
ORDER BY dtLu.pLct DESC
) a 
WHERE a.row > 0 and a.row <= 17

但如果我使用订单ORDER BY dtLu.pLct DESC 它会给我错误...

ORDER BY 子句在视图、内联函数、派生中无效 表、子查询和公用表表达式,除非 TOP、OFFSET 或 FOR XML 也被指定。

我搜索了各种样本,但我的子查询不同,因为每页只需要检索 17 行 (下一页将有这样的最后一行:WHERE a.row &gt; 17 and a.row &lt;=35

如何选择前 17 行但里面有订单?

谢谢

【问题讨论】:

  • it gives me error... - 这是...?
  • @LittleBobbyTables 更新了话题:)
  • 错误信息告诉你该怎么做——你可以在子查询中使用TOP

标签: sql-server sql-server-2008 subquery sql-order-by


【解决方案1】:

您试图将订单放入您的内部查询中,但这是行不通的。将订单移至主查询。此外,您应该列出您的列,而不是使用 *.您可能可以使用更少的子选择稍微改进此查询,但这超出了您的问题范围。

SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY CASE WHEN ISNUMERIC(dtLu.sLu) = 1 THEN CONVERT(INT, dtLu.sLu) ELSE 9999999 END asc, dtLu.sLu) as row, 
dtLu.* --you should list the columns out here
, dtLuDerived.cCll, dtMtrDerived.cMtrCll, dtMtrDerived.cMtrCllIn, dtMtrDerived.cMtrCllOut FROM dtLu
LEFT OUTER JOIN (
    SELECT pLu, COUNT(pLu) AS cCll
    FROM dtCll
    GROUP BY pLu) 
    AS dtLuDerived ON dtLu.pLu = dtLuDerived.pLu
LEFT OUTER JOIN (
    SELECT dtCll.pLu, SUM(cMtrCll) AS cMtrCll, SUM(cMtrCllIn) AS cMtrCllIn, SUM(cMtrCllOut) AS cMtrCllOut
    FROM dtMtrCll
    INNER JOIN dtCll on dtCll.pCll = dtMtrCll.pCll
    WHERE dtCll.pWhr IN (SELECT DISTINCT pWhr FROM dtUserWhr WHERE pUser = 5)
    GROUP BY dtCll.pLu) 
    AS dtMtrDerived ON dtLu.pLu = dtMtrDerived.pLu
INNER JOIN dtLct on dtLct.pLct = dtLu.pLct
WHERE dtLu.pLu > 0 AND dtLct.pLctAsl IN (select pAsl from dtAsl where pAslUnt = 1)
-- this is the ORDER I need
--ORDER BY dtLu.pLct DESC
) a 
WHERE a.row > 0 and a.row <= 17
order by a.pLct

【讨论】:

  • 感谢@Sean,但这不起作用,因为它订购了前 17 条记录,我希望采用前 17 条符合我需要的顺序的记录
  • 嗯?你的评论一点都不清楚。你得到 17 行,但你想要 17 行。你要它们的顺序是什么?
  • 我试着解释一下:没有顺序的查询给了我这个:i.imgur.com/8xewPHc.png'因为默认顺序是按'名称'字段。例如,如果我想要位置字段 (locazione) desc 的顺序,我需要查看的行不是此图像中存在的行,而是其他...
  • 表格没有默认顺序。此外,您正在使用 RowNumber 向您的行添加一个数字。如果您想要某个订单,您可以添加另一个 ROW_NUMBER 作为您的行条件。
  • 或者您可以将前 17 个添加到您的子查询中,然后将订单放回那里。
【解决方案2】:

在子查询中使用TOP 100 Percent

SELECT *
FROM   (SELECT top 100 percent Row_number()
                 OVER (
                   ORDER BY CASE WHEN Isnumeric(dtLu.sLu) = 1 THEN CONVERT(INT, dtLu.sLu) ELSE 9999999 END ASC, dtLu.sLu) AS row,
               dtLu.*,
               dtLuDerived.cCll,
               dtMtrDerived.cMtrCll,
               dtMtrDerived.cMtrCllIn,
               dtMtrDerived.cMtrCllOut
        FROM   dtLu
               LEFT OUTER JOIN (SELECT pLu,
                                       Count(pLu) AS cCll
                                FROM   dtCll
                                GROUP  BY pLu) AS dtLuDerived
                            ON dtLu.pLu = dtLuDerived.pLu
               LEFT OUTER JOIN (SELECT dtCll.pLu,
                                       Sum(cMtrCll)    AS cMtrCll,
                                       Sum(cMtrCllIn)  AS cMtrCllIn,
                                       Sum(cMtrCllOut) AS cMtrCllOut
                                FROM   dtMtrCll
                                       INNER JOIN dtCll
                                               ON dtCll.pCll = dtMtrCll.pCll
                                WHERE  dtCll.pWhr IN (SELECT DISTINCT pWhr
                                                      FROM   dtUserWhr
                                                      WHERE  pUser = 5)
                                GROUP  BY dtCll.pLu) AS dtMtrDerived
                            ON dtLu.pLu = dtMtrDerived.pLu
               INNER JOIN dtLct
                       ON dtLct.pLct = dtLu.pLct
        WHERE  dtLu.pLu > 0
               AND dtLct.pLctAsl IN (SELECT pAsl
                                     FROM   dtAsl
                                     WHERE  pAslUnt = 1)
        -- this is the ORDER I need
        ORDER  BY dtLu.pLct DESC) a
WHERE  a.row > 0
       AND a.row <= 17 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2020-01-05
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多