Условное объединение в T-SQL - PullRequest
0 голосов
/ 02 июня 2011

В настоящее время у меня есть запрос:

-- 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

, только когда amt, возвращаемый Query 2, меньше 0. Иначе мне не нужно объединение, а только результат из Query 1.

Лучший способ, который я могу придумать, - это создать параметризованную скалярную функцию.Как лучше всего это сделать?

1 Ответ

5 голосов
/ 02 июня 2011

Вы можете сохранить результат первого запроса во временной таблице, а затем, если таблица не была пустой, выполнить другой запрос.

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 */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...