1

これら 2 つのステートメントを 1 つのステートメントにまとめるのに苦労しています。

私の最初のステートメントは、実質的に 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

ただし、これら 3 つのステートメントのいずれも情報を返さない場合は、以下の SQL ステートメントを起動して、考えられるすべてのレコードを取得できるようにしたいと考えています。

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

Web サービスからバックエンド データベース (AS/400 DB2 データベース) への呼び出しを 1 回だけ行う必要があるように、これらの両方のステートメントを結合するにはどうすればよいですか?

助けていただければ幸いです。

クリスチャンに感謝します

4

2 に答える 2

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)

... さらに詳しく見てみると、実際の違いはa.GBNK076CTE だけです。「一致する」行が に存在する場合は 1 行のみが必要ですかTHAP076P、それ以外の場合はすべてが必要ですか?

于 2012-11-29T17:33:47.713 に答える
0

AS/400 (iSeries) についてはよくわかりませんが、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)
于 2012-11-28T19:29:56.313 に答える