我目前正在 SQL Server 中处理大型数据集,我需要执行三个不同的
SELECT
查询,每个查询的条件略有不同:
-- Query 1
SELECT * FROM Customers
WHERE CustomerID > 80;
-- Query 2
SELECT * FROM Customers
WHERE CustomerID = 1;
-- Query 3
SELECT * FROM Customers
WHERE Country = 'Mexico';
每个查询都使用相同的一组
JOIN
子句和附加条件,如下所示:
FROM Customers C
LEFT JOIN Orders O ON C.CustomerID = O.CustomerID
LEFT JOIN OtherTables OT ON C.SomeID = OT.SomeID
WHERE C.Active = 1 -- Common condition
AND O.OrderStatus = 'Completed'
我正在使用一个存储过程,其中我依次执行所有三个查询,并且每个结果都使用
SET
: 存储在不同的变量中
SET @result1 = (/* Query 1 with common joins and conditions */);
SET @result2 = (/* Query 2 with common joins and conditions */);
SET @result3 = (/* Query 3 with common joins and conditions */);
但是,由于数据量较大,执行这些查询需要花费大量时间,有时甚至会杀死会话,导致没有输出。
JOIN
和 WHERE
条件,同时仍将结果存储在单独的变量中?我尝试使用 CTE 来减少重复,但 CTE 只允许跟随一个 SELECT 语句,这不适用于我将多个结果存储到不同变量中的要求。
任何有关如何优化这些查询或存储过程本身的建议将不胜感激!
好的,您提出的问题太宽泛,因为您在一个问题中提出了太多问题。然而,当您要求使用具有不同
WHERE
子句的类似结果集时,这里有一种最小化处理的方法:
-- Query 1
WITH cte AS (
SELECT Id, 1 AS Criteria1, 0 AS Criteria2, 0 AS Criteria3
FROM Customers
WHERE CustomerID > 80;
UNION ALL
-- Query 2
SELECT id, 0, 1, 0
FROM Customers
WHERE CustomerID = 1;
UNION ALL
-- Query 3
SELECT id, 0, 0, 1
FROM Customers
WHERE Country = 'Mexico'
)
SELECT Id, MAX(Criteria1) Criteria1, MAX(Criteria2) Criteria2, MAX(Criteria3) Criteria3
INTO #temp_table1
FROM cte
GROUP BY Id;
SELECT Id, Criteria1, Criteria2, Criteria3 -- and other required columns
INTO #temp_table2
FROM #temp_table1
-- JOIN table1
-- JOIN table2
-- etc
SELECT *
FROM #temp_table2
WHERE Criteria1 = 1;
SELECT *
FROM #temp_table2
WHERE Criteria1 = 2;
SELECT *
FROM #temp_table2
WHERE Criteria1 = 3;