2012-06-18 196 views
-2

我有兩個選擇查詢用於我的項目中獲取數據並將其顯示在我的網頁中。我想加入他們,這樣我只需要訪問一次數據。但我不知道如何加入它們,因爲其中一個查詢包含組功能。你可以幫幫我嗎?提前致謝。加入兩個查詢

回答

1

解決這個問題的一種方法是在幾個步驟中完成這項工作。在將結果集加入查詢之前,您需要將其保存在臨時表或表變量中。 (如果你期待一個大的結果集的臨時表可能是可取的。)

基本上,你的查詢將改變這樣的事情:

/* prepare the storage */ 
IF OBJECT_ID('tempdb..#sp_results') IS NOT NULL 
    DROP TABLE #sp_results; 
CREATE TABLE #sp_results (
    /* the types may be wrong, please modify as necessary */ 
    currency_cd int, 
    salary decimal(10,2) 
); 

/* save the results of the SP */ 
INSERT INTO #sp_results 
EXEC SP_namearguments… 

/* use the saved results in your query */ 
SELECT 
    your present columns, 
    tmp.currency_cd, 
    tmp.salary 
FROM 
    your present joins 
    LEFT OUTER JOIN #sp_results AS tmp ON a proper join condition 
; 

的問題是,雖然,你的SP被設計成返回個人員工的結果,同時查詢似乎正在檢索多個員工的數據。要解決該問題,您可以將employee_code列添加到臨時表中,並使用循環在遊標中逐個獲取/保存每個員工的結果。

但是,這可能是最糟糕的使用遊標的例子之一。一個更好的選擇可能是創建返回相同的數據,因爲SP視圖,但所有員工:

CREATE VIEW employees_compensation_view 
AS 
SELECT 
    employee_code, 
    currency_cd, 
    SUM(comprate) AS salary 
FROM employees_compensation 
GROUP BY 
    employee_code, 
    currency_cd 

你會那麼可以只對視圖加入到您的查詢,像這樣:

SELECT 
    your present columns, 
    ecv.currency_cd, 
    ecv.salary 
FROM 
    your present joins 
    LEFT OUTER JOIN employees_compensation_view AS ecv 
    ON b.employee_code = ecv.employee_code 
; 

對於你的業務邏輯的更好的封裝,你也可以更改存儲過程的查詢是這樣的:

SELECT 
    currency_cd, 
    salary 
FROM employees_compensation_view 
WHERE employee_code = @emp_code 

也就是說,如果你仍然需要那個SP。

+1

謝謝。我創建了employees_compensation_view並將其加入到我的查詢中。 –