1

OracleでSQLを実行するためにバックエンドソフトウェアを使用しています。発効日に基づいて最新の行を取得する必要があります。

これがサンプルテーブルです

Table "ACCOUNTS"
Application | Sub_category | Account_Reference | Effective_date
BC_ONLINE   | F            | ABC1234           | 01-JAN-13
BC_ONLINE   | B            | ABC2345           | 01-JAN-13
TE_Notice   | (NULL)       | 1234ABC           | 01-JAN-13
TE_Notice   | (NULL)       | 9876DEF           | 01-APR-13

ソフトウェアは、次の2つのパラメーターを渡します。次のSQLを使用した場合、次のアプリケーションでApplicationとSub_category:BC_ONLINEとSub_category:F

select a.Account_Reference
from   ACCOUNTS a
where  a.Application = 'BC_ONLINE'
and    a.Sub_category = 'F'
and    a.Effective_date = (select max(b.Effective_date)
                           from   ACCOUNTS b
                           where  b.Effective_date <= sysdate
                           and    b.Application = a.Application
                           and    b.Sub_category = a.Sub_category)

ただし、次のアプリケーションを使用する必要があります:TE_NoticeおよびSub_category:NULL であり、これを使用することはできません

and    a.Sub_category = null

それがなければならないので

and    a.Sub_category is null

問題はソフトウェアが修正されていることです。max(effective_date)を使用してwhere句でvalueとnullの両方を使用する最良の方法は何ですか?

この方法を試しましたが、うまくいきません

select a.Account_Reference
from   ACCOUNTS a
where  a.Application = 'TE_Notice'
and    (a.Sub_category = '' or a.Sub_category is null)
and    a.Effective_date = (select max(b.Effective_date)
                           from   ACCOUNTS b
                           where  b.Effective_date <= sysdate
                           and    b.Application = a.Application
                           and    NVL(b.Sub_category,-1) = NVL(a.Sub_category,-1))

単に01-APR-13の行を返しましたが、 01-JAN-13のEffective_dateの行を取得する必要があります。

4

2 に答える 2

1

どうですか:

 select account_reference
 from   (
        select   a.Account_Reference
        from     ACCOUNTS a
        where    a.Application = 'BC_ONLINE'
        and      a.Sub_category = 'F'
        and      a.effective_date <= sysdate
        order by a.Effective_date desc)
 where  rownum = 1
于 2013-02-22T12:42:31.657 に答える
0

@AlexPoole のおかげで、私が質問に入れた SQL は実際には正しいですが、磨きが必要でした。

私が以下を採用した場合:

and (a.Sub_category = '' or a.Sub_category is null)

select は、null 以外の値だけでなく null 行もフェッチするため、改善する必要があります。

and (a.Sub_category = '' or ('' is null and a.Sub_category is null))

全体的なSQLは

select a.Account_Reference
from   ACCOUNTS a
where  a.Application = @Application
and    (a.Sub_category = @Sub_category or (@Sub_category is null and a.Sub_category is null))
and    a.Effective_date = (select max(b.Effective_date)
                           from   ACCOUNTS b
                           where  b.Effective_date <= sysdate
                           and    b.Application = a.Application
                           and    NVL(b.Sub_category,-1) = NVL(a.Sub_category,-1))
于 2013-02-22T14:35:02.807 に答える