2012-11-28 56 views
1

我正努力將這兩個陳述合併成一個陳述。SQL:如果第一個查詢沒有返回任何行,則調用第二個查詢

我的第一條語句實際上是3條語句,我只希望返回值的第一條語句返回,這是一種享受。

SELECT ReferenceKey, ReferenceValue FROM 
( 
    SELECT a.GBNK076 AS ReferenceKey, TRIM(a.GBNK076) ||' - '|| b.BANM11 AS ReferenceValue, 1 as preference 
    FROM THTFU.THAP076P AS a LEFT OUTER JOIN OSLTHLF3.CSP11 AS b ON b.BANK11 = a.GBNK076 AND b.CONO11 = a.CONO076 
    WHERE a.CONO076 = '01' AND a.PMTH076 = 'BMG' AND a.CURN076 = 'EUR' 
    UNION 
    SELECT a.GBNK076 AS ReferenceKey, TRIM(a.GBNK076) ||' - '|| b.BANM11 AS ReferenceValue, 3 as preference 
    FROM THTFU.THAP076P AS a LEFT OUTER JOIN OSLTHLF3.CSP11 AS b ON b.BANK11 = a.GBNK076 AND b.CONO11 = a.CONO076 
    WHERE a.CONO076 = '01' AND a.PMTH076 = 'BMG' AND a.CURN076 = '' 
    UNION 
    SELECT a.GBNK076 AS ReferenceKey, TRIM(a.GBNK076) ||' - '|| b.BANM11 AS ReferenceValue, 3 as preference 
    FROM THTFU.THAP076P AS a LEFT OUTER JOIN OSLTHLF3.CSP11 AS b ON b.BANK11 = a.GBNK076 AND b.CONO11 = a.CONO076 
    WHERE a.CONO076 = '01' AND a.PMTH076 = '' AND a.CURN076 = '' 
)BankPayingFrom ORDER BY preference 
FETCH FIRST 1 ROWS ONLY 

但是,如果沒有這三個語句返回任何信息,我想低於能斷火的SQL語句檢索所有可能的記錄。

SELECT BANK11 as ReferenceKey, TRIM(BANK11) ||' - '|| BANM11 as ReferenceValue From OSLTHLF3.CSP11 WHERE CONO11 = '01' 

如何加入這兩個語句組合在一起,這樣我只能讓從我的Web服務的一個調用後端數據庫(AS/400 DB2數據庫)?

我很感激任何幫助。

非常感謝 基督教

+0

你需要所有'聯盟'嗎?你可以使用一個語句,並根據需要添加一些「OR」(可能是一個「CASE」)? –

+0

真的不知道我是否應該這樣做,但是我在Google上搜索並且在公平的時候工作,我停在那裏:) –

+0

好問題.. –

回答

1

不知道你的數據集,很難知道當然,但我相信這可能是一個更清潔的選擇。它可能執行更快,但我不能保證。

WITH BankPayingFrom (referenceKey, referenceValue) as (
     SELECT a.GBNK076, TRIM(b.BANK11) ||' - '|| b.BANM11 -- typo? 'b.BANK11'? 
     FROM THTFU.THAP076P as a 
     LEFT JOIN OSLTHLF3.CSP11 as b 
       ON b.BANK11 = a.GBNK067 
        AND b.CONO11 = a.CONO076 
     WHERE a.CONO076 = '01' 
      AND ((a.PMTH076 = 'BMG' AND a.CURN076 = 'EUR') 
       OR (a.PMTH076 = 'BMG' AND a.CURN076 = '') 
       OR (a.PMTH076 = '' AND a.CURN076 = '')) 
      -- You may be able to use the following, but only if 
      -- a.PMTH076 is set for every set value of a.CURN076 
       -- AND (a.PMTH076 = 'BMG' OR a.PMTH067 = '') 
       -- AND (a.CURN076 = 'EUR' OR a.CURN076 = '') 
     ORDER BY a.PMTH076 DESC, a.CURN076 DESC 
     FETCH FIRST 1 ROW ONLY) 

SELECT referenceKey, referenceValue 
FROM BankPayingFrom 
UNION 
SELECT BANK11 as referenceKey, TRIM(BANK11) ||' - '|| BANM11 as referenceValue 
FROM OSLTHLF3.CSP11 
WHERE CONO11 = '01' 
     AND NOT EXISTS (SELECT '1' 
         FROM BankPayingFrom) 

...雖然看着它,唯一真正的區別是CTE中的a.GBNK076。如果THAP076P中存在「匹配」行,那麼您是否只需要1行?否則您想要所有這些行?

0

約AS/400(i系列)不知道,但這裏是我怎麼可能做它在Linux和UNIX的Windows:

WITH BankOrderFromOne(ReferenceKey, ReferenceValue) 
AS (
    SELECT ReferenceKey, ReferenceValue FROM 
    ( 
     SELECT a.GBNK076 AS ReferenceKey, TRIM(a.GBNK076) ||' - '|| b.BANM11 AS ReferenceValue, 1 as preference 
     FROM THTFU.THAP076P AS a LEFT OUTER JOIN OSLTHLF3.CSP11 AS b ON b.BANK11 = a.GBNK076 AND b.CONO11 = a.CONO076 
     WHERE a.CONO076 = '01' AND a.PMTH076 = 'BMG' AND a.CURN076 = 'EUR' 
     UNION 
     SELECT a.GBNK076 AS ReferenceKey, TRIM(a.GBNK076) ||' - '|| b.BANM11 AS ReferenceValue, 3 as preference 
     FROM THTFU.THAP076P AS a LEFT OUTER JOIN OSLTHLF3.CSP11 AS b ON b.BANK11 = a.GBNK076 AND b.CONO11 = a.CONO076 
     WHERE a.CONO076 = '01' AND a.PMTH076 = 'BMG' AND a.CURN076 = '' 
     UNION 
     SELECT a.GBNK076 AS ReferenceKey, TRIM(a.GBNK076) ||' - '|| b.BANM11 AS ReferenceValue, 3 as preference 
     FROM THTFU.THAP076P AS a LEFT OUTER JOIN OSLTHLF3.CSP11 AS b ON b.BANK11 = a.GBNK076 AND b.CONO11 = a.CONO076 
     WHERE a.CONO076 = '01' AND a.PMTH076 = '' AND a.CURN076 = '' 
    )BankPayingFrom ORDER BY preference 
    FETCH FIRST 1 ROWS ONLY 
) 

SELECT ReferenceKey, ReferenceValue FROM BankOrderFromOne 

UNION 

SELECT BANK11 as ReferenceKey, TRIM(BANK11) ||' - '|| BANM11 as ReferenceValue From OSLTHLF3.CSP11 WHERE CONO11 = '01' 
AND NOT EXISTS (SELECT ReferenceKey, ReferenceValue FROM BankOrderFromOne) 
+1

這是一個絕對的對待,非常感謝你:) –

相關問題