2014-12-27 24 views
2

這裏是我的查詢但它越來越錯誤如何使用ORDER BY子句的SQL Server 2014

錯誤

消息156,15級,狀態1,第6行
時使用UNION ALL關鍵字「訂單」附近的語法不正確。

Msg 156,Level 15,State 1,Line 13
關鍵字'order'附近的語法不正確。

Msg 156,Level 15,State 1,Line 20
關鍵字'order'附近的語法不正確。

查詢

(SELECT TOP 20 cl_RooSiteId, 
       cl_CrawlOrgUrl 
FROM tblCrawlUrls 
WHERE Sysutcdatetime() > Dateadd(MINUTE, 50000, cl_LastCrawlDate) 
     AND cl_DuplicateUrl_ByCanonical = 0 
     AND cl_RooSiteId = 1 
ORDER BY cl_LastCrawlDate ASC) 
UNION ALL 
(SELECT TOP 200 cl_RooSiteId, 
       cl_CrawlOrgUrl 
FROM tblCrawlUrls 
WHERE Sysutcdatetime() > Dateadd(MINUTE, 50000, cl_LastCrawlDate) 
     AND cl_DuplicateUrl_ByCanonical = 0 
     AND cl_RooSiteId = 2 
ORDER BY cl_LastCrawlDate ASC) 
UNION ALL 
(SELECT TOP 50 cl_RooSiteId, 
       cl_CrawlOrgUrl 
FROM tblCrawlUrls 
WHERE Sysutcdatetime() > Dateadd(MINUTE, 50000, cl_LastCrawlDate) 
     AND cl_DuplicateUrl_ByCanonical = 0 
     AND cl_RooSiteId = 3 
ORDER BY cl_LastCrawlDate ASC) 

那麼我們應該如何寫的方式,它應該工作?

+0

不能通過UNION(ALL)之間放一個爲了創建一個頂級選擇再由那裏放的順序。 – agentpx 2014-12-27 14:33:08

+0

@agentpx所以我如何才能實現我想實現的目標?我也嘗試封裝他們在上一級選擇,但它也失敗 – MonsterMMORPG 2014-12-27 14:35:07

+0

ty我看到MSSQL不能夠我所要求的,所以它似乎最好返回每個查詢作爲表,然後在我的代碼後面處理。每個查詢需要單獨排序而不是返回的結果。 – MonsterMMORPG 2014-12-27 14:42:49

回答

1

複製查詢結果爲temp table和使用Union all

SELECT TOP 20 cl_RooSiteId, 
       cl_CrawlOrgUrl,cl_LastCrawlDate 
INTO #Temp1 
FROM tblCrawlUrls 
WHERE Sysutcdatetime() > Dateadd(MINUTE, 50000, cl_LastCrawlDate) 
     AND cl_DuplicateUrl_ByCanonical = 0 
     AND cl_RooSiteId = 1 
ORDER BY cl_LastCrawlDate ASC 

SELECT TOP 200 cl_RooSiteId, 
       cl_CrawlOrgUrl,cl_LastCrawlDate 
INTO #temp2 
FROM tblCrawlUrls 
WHERE Sysutcdatetime() > Dateadd(MINUTE, 50000, cl_LastCrawlDate) 
     AND cl_DuplicateUrl_ByCanonical = 0 
     AND cl_RooSiteId = 2 
ORDER BY cl_LastCrawlDate ASC 

SELECT TOP 50 cl_RooSiteId, 
       cl_CrawlOrgUrl,cl_LastCrawlDate 
INTO #temp3 
FROM tblCrawlUrls 
WHERE Sysutcdatetime() > Dateadd(MINUTE, 50000, cl_LastCrawlDate) 
     AND cl_DuplicateUrl_ByCanonical = 0 
     AND cl_RooSiteId = 3 
ORDER BY cl_LastCrawlDate ASC 

SELECT cl_RooSiteId,cl_CrawlOrgUrl FROM #Temp1 
UNION ALL 
SELECT cl_RooSiteId,cl_CrawlOrgUrl FROM #Temp2 
UNION ALL 
SELECT cl_RooSiteId,cl_CrawlOrgUrl FROM #Temp3 
Order by cl_LastCrawlDate 

或者使用Stacked CTE

;WITH cte1 
    AS (SELECT TOP 20 cl_RooSiteId, 
         cl_CrawlOrgUrl,cl_LastCrawlDate 
     FROM tblCrawlUrls 
     WHERE Sysutcdatetime() > Dateadd(MINUTE, 50000, cl_LastCrawlDate) 
       AND cl_DuplicateUrl_ByCanonical = 0 
       AND cl_RooSiteId = 1 
     ORDER BY cl_LastCrawlDate ASC), 
    cte2 
    AS (SELECT TOP 200 cl_RooSiteId, 
         cl_CrawlOrgUrl,cl_LastCrawlDate 
     FROM tblCrawlUrls 
     WHERE Sysutcdatetime() > Dateadd(MINUTE, 50000, cl_LastCrawlDate) 
       AND cl_DuplicateUrl_ByCanonical = 0 
       AND cl_RooSiteId = 2 
     ORDER BY cl_LastCrawlDate ASC), 
    cte3 
    AS (SELECT TOP 50 cl_RooSiteId, 
         cl_CrawlOrgUrl,cl_LastCrawlDate 
     FROM tblCrawlUrls 
     WHERE Sysutcdatetime() > Dateadd(MINUTE, 50000, cl_LastCrawlDate) 
       AND cl_DuplicateUrl_ByCanonical = 0 
       AND cl_RooSiteId = 3 
     ORDER BY cl_LastCrawlDate ASC) 
SELECT cl_RooSiteId,cl_CrawlOrgUrl FROM cte1 
UNION ALL 
SELECT cl_RooSiteId,cl_CrawlOrgUrl FROM cte2 
UNION ALL 
SELECT cl_RooSiteId,cl_CrawlOrgUrl FROM cte3 
ORDER BY cl_LastCrawlDate ASC 
+0

ty for answer已經嘗試過,它也不工作錯誤:消息104,級別16,狀態1,行21 如果語句包含UNION,INTERSECT或EXCEPT運算符,則ORDER BY項目必須出現在選擇列表中。 – MonsterMMORPG 2014-12-27 14:34:18

+0

@MonsterMMORPG - 立即更新。 – 2014-12-27 14:39:34

+0

ty我看到MSSQL不能勝任,所以它似乎最好將每個查詢作爲表返回,然後在我的代碼後面處理。每個查詢需要單獨排序而不是返回的結果。 – MonsterMMORPG 2014-12-27 14:42:07

1

公共表表達式應​​該做的伎倆SEE THIS LINK

公共表表達式(CTE)可以被認爲是在唱歌的執行範圍內定義的臨時結果集SELECT,INSERT,UPDATE,DELETE或CREATE VIEW語句。 CTE類似於派生表,因爲它不是作爲對象存儲的,而是僅在查詢期間持續。與派生表不同,CTE可以自引用,並且可以在同一個查詢中多次引用。

這裏有一個片段

WITH TopLevel(colum1, column2, ...) AS 
(
    SELECT column1, column2, ... 
    FROM table1 --without ORDER BY 

    UNION ALL 

    SELECT column1, column2, ... 
    FROM table2 --without ORDER BY 
    . 
    . 
    . 

) 
SELECT * FROM 
FROM TopLevel 
ORDER BY column1, column2... --ORDER BY HERE... 
+0

ty我看到MSSQL不能夠我所要求的,所以它似乎最好返回每個查詢作爲表格,然後在我的代碼後面處理。每個查詢需要單獨排序而不是返回的結果。 – MonsterMMORPG 2014-12-27 14:43:21

4

假設你在你寫的順序希望這些:

SELECT cl_RooSiteId, cl_CrawlOrgUrl 
FROM ((SELECT TOP 20 cl_RooSiteId, cl_CrawlOrgUrl, cl_LastCrawlDate, 0 as priority 
     FROM tblCrawlUrls 
     WHERE Sysutcdatetime() > Dateadd(MINUTE, 50000, cl_LastCrawlDate) AND 
       cl_DuplicateUrl_ByCanonical = 0 AND 
       cl_RooSiteId = 1 
    ) UNION ALL 
     (SELECT TOP 200 cl_RooSiteId, cl_CrawlOrgUrl, cl_LastCrawlDate, 1 as priority 
     FROM tblCrawlUrls 
     WHERE Sysutcdatetime() > Dateadd(MINUTE, 50000, cl_LastCrawlDate) AND 
       cl_DuplicateUrl_ByCanonical = 0 AND 
       cl_RooSiteId = 2 
    ) UNION ALL 
     (SELECT TOP 50 cl_RooSiteId, cl_CrawlOrgUrl, cl_LastCrawlDate, 2 
     FROM tblCrawlUrls 
     WHERE Sysutcdatetime() > Dateadd(MINUTE, 50000, cl_LastCrawlDate) AND 
       cl_DuplicateUrl_ByCanonical = 0 AND 
       cl_RooSiteId = 3 
    ) 
    ) c 
ORDER BY priority, cl_LastCrawlDate ASC 

注意在子查詢中包含的prioritycl_LastCrawlDate。我知道priority是多餘的,因爲您可以使用ORDER BY cl_RooSiteId, cl_LastCrawlDate

編輯:

你也可以做到這一點沒有union all

SELECT cl_RooSiteId, cl_CrawlOrgUrl 
FROM (SELECT c.*, 
      ROW_NUMBER() OVER (PARTITION BY cl_RooSiteId ORDER BY cl_LastCrawlDate) as seqnum 
     FROM tblCrawlUrls c 
     WHERE Sysutcdatetime() > Dateadd(MINUTE, 50000, cl_LastCrawlDate) AND 
      cl_DuplicateUrl_ByCanonical = 0 
    ) c 
WHERE (cl_RooSiteId = 1 and seqnum <= 20) OR 
     (cl_RooSiteId = 2 and seqnum <= 200) OR 
     (cl_RooSiteId = 3 and seqnum <= 50) 
ORDER BY cl_RooSiteId, cl_LastCrawlDate; 
+0

組合結果的順序並不重要。只有個別選擇順序對於檢索非常先未爬行的URL是很重要的。您的第二個查詢不起作用也給錯誤消息156,級別15,狀態1,行8 關鍵字'WHERE'附近的語法不正確。 – MonsterMMORPG 2014-12-27 15:00:29

+0

只是給派生表一個名字)derivedTable – Paparazzi 2014-12-27 15:02:06

+0

這當之無愧的檢查+1 – Paparazzi 2014-12-27 17:39:44