2

私はこの2つのクエリを持っています:

クエリ#1

SELECT A1.clrn_id  ,A1.gpgroup ,A1.cl_id
FROM p_dtl A1
WHERE A1.PYMT_DT = TO_DATE(:1 ,'YYYY-MM-DD') 
and A1.clrn_id in (
                     select clrn_id  
                     from gp_cl_rn run  
                     where run.clrn_id = a1.clrn_id 
                     and run.finalized_ind = :2
                  )
                    AND cl_id IN 
                        ( 
                            SELECT cl_id 
                            FROM hm_sal 
                            WHERE oprt_id ='004038'  
                            AND runctrl_id = :3
                        )  

クエリ#2

SELECT B.eid
FROM JBB B
WHERE B.eid IN 
(
    (
        SELECT eid
        FROM pbank A
        WHERE (bankid,branchid) IN 
        (
            SELECT bankid  ,branchid  
            FROM pbranch 
            WHERE sourceid = :1
            AND estat=:2
        )
        AND ESTAT = :2
        AND acct_type = :3
        AND acct_id = (
                select max(D.acct_id) 
                from pbank D 
                where D.eid = A.eid
                AND D.ESTAT = :2
                AND D.acct_type = :3)
     )
)

clrn_id1番目のクエリとB.eid2番目のクエリのをEXISTS関数に変更するにはどうすればよいですか?そしてbankid、、branchidそしてacct_idまたEXISTS機能に変更可能ですか?

前もって感謝します!

4

3 に答える 3

3

これを に変更できますが、代わりに次のように変更することwhere existsをお勧めします。join

SELECT B.eid
  FROM JBB B
  JOIN ( SELECT eid, estat, acct_type, acct_id
              , max(acct_id) over ( partition by eid ) as max_acct
           FROM pbank 
                ) A
    ON b.eid = a.eid
  JOIN pbranch C
    ON a.bankid = c.bankid
   AND a.branchid = c.brahchid
 WHERE c.sourceid = :1
   AND c.estat = :2
   AND a.ESTAT = :3
   AND a.acct_type = :4
   AND a.acct_id = a.max_acct

分析関数max()を使用すると、サブ選択の必要がなくなります。また、この方法で物事を行う方がはるかに明確だと思います。


そして、新しく追加されたクエリは次のようになります。

SELECT A1.clrn_id, A1.gpgroup, A1.cl_id
  FROM p_dtl A1
  JOIN gp_cl_rn run
    ON A1.clrn_id = run.clrn_id
 WHERE A1.PYMT_DT = TO_DATE(:1 ,'YYYY-MM-DD') 
   AND run.clrn_id = a1.clrn_id 
   AND run.finalized_ind = :2

関数を明示的に使用していることに気付きましたto_date()。これは、日付を文字列として保存していることを意味します。これは悪い習慣であり、長期的には問題を引き起こす可能性があります...可能な限り避けてください。


max(acct_id) over ( partition by eid ) 

分析関数です。これは集計関数とまったく同じmax()ですが、GROUP BY を必要とする代わりに、結果セットのすべての行に対して同じ結果を返します。

acct_idこの特定の使用法は、すべての最大値を返しますeid。分析関数はたくさんありますが、自分で試してみることをお勧めします。オンラインで入手できるいくつかの例もあります。

JOIN を使用することは必ずしもよりも速いとは限りませんwhere exists。すべての場合と同様に、両方を試して、特定の状況により適したものを確認することをお勧めします.

一般に、それらは異なる目的を持っています。where exists条件を満たす行が 1 つ見つかった場合に行の "計算" を停止するように設計されています。JOIN、すべてを行います。あなたの場合、すべてが欲しいので、それらの中から選択するものはほとんどないかもしれませんが、私は常にJOINを使用します。インデックスが正しいことを確認してください。

于 2012-09-09T10:53:40.510 に答える
2

私はそれがあなたを助けることを願っています:

SELECT B.eid
FROM JBB B
where exists
(
    SELECT 1
    FROM pbank A
    WHERE exists
        (
            SELECT 1 
            FROM pbranch PB
            WHERE PB.sourceid = :1
            AND PB.estat=:2
            and PB.bankid  = A.bankid
            AND PB.branchid  = A.branchid
        )
        AND ESTAT = :2
        AND acct_type = :3
        AND A.eid = B.eid
        AND acct_id = (
                select max(D.acct_id) 
                from pbank D 
                where D.eid = A.eid
                AND D.eid = B.eid
                AND D.ESTAT = :2
                AND D.acct_type = :3)
)
于 2012-09-09T10:53:31.187 に答える
1
SELECT B.eid
FROM JBB B
JOIN
(
    (
        SELECT eid
        FROM pbank A
        WHERE (bankid,branchid) IN 
        (
            SELECT bankid  ,branchid  
            FROM pbranch 
            WHERE sourceid = 'BNIATB'
            AND estat='A'
        )
        AND ESTAT = 'A'
        AND acct_type = 'S'
        AND acct_id = (
                select max(D.acct_id) 
                from pbank D 
                where D.eid = A.eid
                AND D.ESTAT = 'A'
                AND D.acct_type = 'S')
     )
) C on B.eid = c.EID
于 2012-09-09T10:47:49.437 に答える