2017-08-10 100 views
0

嘿,我有一些查詢是通過活動記錄動態生成的,出於性能方面的原因,我需要將它們合併到一起並一次性發送到MSSQL。如何在mssql中進行聯合查詢

我試過以下,它在postgresql中效果很好,但我無法讓它在MSSQL中工作。

(SELECT [panels].* FROM [panels] WHERE [panels].[environment_id] = 14 AND [panels].[agglo_code_id] = 23 AND [panels].[advert_area_id] = 161 AND [panels].[product_id] = 25 AND (NOT EXISTS(SELECT 1 FROM campaign_search_panels WHERE campaign_search_panels.panel_id = panels.panel_id AND campaign_search_panels.campaign_id = 65)) AND (NOT EXISTS(SELECT 1 FROM "AIDAAU_Avails" WHERE "AIDAAU_Avails"."PanelID" = panels.panel_uid AND "AIDAAU_Avails"."TillDate" >= '08-21-2017' AND "AIDAAU_Avails"."FromDate" <= '09-03-2017')) ORDER BY [panels].[random_order] ASC OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY) 
UNION ALL 
(SELECT [panels].* FROM [panels] WHERE [panels].[environment_id] = 14 AND [panels].[agglo_code_id] = 23 AND [panels].[advert_area_id] = 136 AND [panels].[product_id] = 25 AND (NOT EXISTS(SELECT 1 FROM campaign_search_panels WHERE campaign_search_panels.panel_id = panels.panel_id AND campaign_search_panels.campaign_id = 65)) AND (NOT EXISTS(SELECT 1 FROM "AIDAAU_Avails" WHERE "AIDAAU_Avails"."PanelID" = panels.panel_uid AND "AIDAAU_Avails"."TillDate" >= '08-21-2017' AND "AIDAAU_Avails"."FromDate" <= '09-03-2017')) ORDER BY [panels].[random_order] ASC OFFSET 0 ROWS FETCH NEXT 2 ROWS ONLY) 

現在我認爲有兩個問題,我可以發現已經。如果我刪除圍繞每個查詢的括號,然後我接近但仍然抱怨ORDER。我有一種感覺,你只能在結果之後進行排序,但對於如何將每個單獨的sql查詢放在一起,我沒有太多的控制權,而只是將它們結合起來。理想情況下,我希望保持這兩種能力,併爲每個子查詢設置限制子句。有沒有簡單的方法把它們放在一起,這樣它們將在MSSQL中工作,而不僅僅是postgres?

感謝您的幫助!

+1

' OFFSET 0 ROWS FETCH FIRST(SELECT 0)'您是否跳過整個第一個結果集?如果是,那麼'UNION ALL'有什麼意義呢? – lad2025

+0

謝謝:)我已經修復了。在我的真實例子中,我實際上有大約25個這樣的語句聯合在一起,其中一些語句沒有返回任何我認爲是愚蠢的,但它又來自SQL的創建方式。任何想法如何解決上述問題? – Nick

回答

1

在UNION查詢,你只能有一個ORDER BY子句和它必須走到底:

SELECT * from <table1> 
UNION ALL 
SELECT * from <table2> 
ORDER BY <col1> 

您必須刪除ORDER BY您的熱門查詢,它應該正常工作