2011-06-02 97 views
0

目前我有一個查詢,如下所示:有條件的聯盟T-SQL

-- Query 1 
SELECT 
    acc_code, acc_name, alias, LAmt, coalesce(LAmt,0) AS amt 
FROM 
    (SELECT 
     acc_code, acc_name, alias, 
     (SELECT 
      (SUM(cr_amt)-SUM(dr_amt)) 
     FROM 
      ledger_mcg l 
     WHERE 
      (l.acc_code LIKE a.acc_code + '.%' OR l.acc_code=a.acc_code) 
     AND 
      fy_id=1 
     AND 
      posted_date BETWEEN '2010-01-01' AND '2011-06-02') AS LAmt 
    FROM 
     acc_head_mcg AS a 
    WHERE 
    (acc_type='4')) AS T1 
WHERE 
    coalesce(LAmt,0)<>0 

查詢2是相同的查詢1除了acc_type = '5'在查詢2.查詢2總是返回一個單行結果集。現在,我需要工會的兩個查詢,即

Query 1 
UNION 
Query 2 

只有當查詢2返回的AMT小於0。否則,我不需要從查詢工會,但只有resulset 1

我能想到的最好方法是創建一個參數化的標量函數。我該如何做到最好?

+0

只是一個觀察:由於coalesce(LAmt,0)<> 0'條件,'coalesce(LAmt,0)AS amt'列似乎是多餘的。 – 2011-06-02 15:36:13

回答

5

您可以將第一個查詢的結果存儲到一個臨時表中,如果該表不是空的,則執行另一個查詢。

IF OBJECT_ID('tempdb..#MultipleQueriesResults') IS NOT NULL 
    DROP TABLE #MultipleQueriesResults; 

SELECT 
    acc_code, acc_name, alias, LAmt, coalesce(LAmt,0) AS amt 
INTO #MultipleQueriesResults 
FROM 
    (SELECT 
     acc_code, acc_name, alias, 
     (SELECT 
      (SUM(cr_amt)-SUM(dr_amt)) 
     FROM 
      ledger_mcg l 
     WHERE 
      (l.acc_code LIKE a.acc_code + '.%' OR l.acc_code=a.acc_code) 
     AND 
      fy_id=1 
     AND 
      posted_date BETWEEN '2010-01-01' AND '2011-06-02') AS LAmt 
    FROM 
     acc_head_mcg AS a 
    WHERE 
    (acc_type='4')) AS T1 
WHERE 
    coalesce(LAmt,0)<>0; 

IF NOT EXISTS (SELECT * FROM #MultipleQueriesResults) 
    … /* run Query 2 */ 
+0

那麼需求發生了輕微的變化,查詢本身也是如此。但你的答案仍然對我有幫助。 – mannyee 2011-06-05 11:14:27