2017-08-10 104 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您的热门查询,它应该正常工作