sql命令由子查询内部组成

时间:2014-12-15 14:36:14

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

我有这个问题:

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 > 17 and a.row <=35

如何选择前17行,但内部有订单?

感谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在子查询中使用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