0

私は3つのテーブルを持っています:

  1. フィールド cons_id_no、key_id を持つ消費者
  2. フィールドkey_id、bill_id_no、amt_payable、bill_dateを持つbm_bill(消費者の請求額と日付のすべてが含まれます)
  3. フィールドkey_id、receipt_no、amt_paid、fine、pay_dateを持つmreceipt (消費者のすべての支払いの詳細が含まれます)

consumer テーブルは、bm_bill および mreceipt と 1 対多の関係にあります。コンシューマーのcons_id_noから台帳情報を作成したい。彼の cons_id_no、key_id、bill_id_no (最新)、bill_date (最新)、amt_payable (最新)、receipt_no (最新)、amt_paid (最新)、fine (最新)、pay_date (最新) が含まれている必要があり、そのために以下を作成しましたクエリ

私はここで質問 をしましたが、その解決策を 1 つ見つけましたが、請求書と支払いのテーブルからデータ全体を取得していたため、それでも十分ではありませんでした。そこから得たヒントに従って、次のような別の解決策に到達しました。

まず、タイプを作成しました:

CREATE OR REPLACE TYPE key_id_row AS OBJECT
    (
        key_id number(10)
    );

次に、テーブル タイプを作成します。

CREATE OR REPLACE TYPE key_id_tab AS TABLE OF key_id_row;

次に、関数を作成しました。

CREATE OR REPLACE FUNCTION get_key_id(cons_id VARCHAR2) RETURN key_id_tab IS
    result_tab key_id_tab;    
BEGIN
    SELECT
        key_id_row(key_id)
    BULK COLLECT INTO 
        result_tab
    FROM
        consumer
    WHERE
        cons_id_no = cons_id;
    RETURN result_tab;    
END get_key_id;

その後、次のようにクエリで使用しました。

SELECT
    c.key_id,
    c.cons_id_no consumerid,
    b.bill_id_no,
    b.key_id,
    b.bill_date,
    m.key_id,
    m.receipt_no,
    m.pay_date    
FROM
    consumer c
LEFT OUTER JOIN
    (
        SELECT
            bb.bill_id_no,
            gk.key_id,
            bb.bill_date,
            ROW_NUMBER() OVER (PARTITION BY bb.key_id ORDER BY bb.bill_date DESC) AS rowNumber
        FROM
            bm_bill bb
        JOIN
            TABLE(get_key_id('2114109999')) gk
        ON
            (gk.key_id = bb.key_id)    
    ) b
ON
    (b.rowNumber = 1)
LEFT OUTER JOIN 
    (
        SELECT
            gk.key_id,
            mr.receipt_no,
            mr.pay_date,
            ROW_NUMBER() OVER (PARTITION BY mr.key_id ORDER BY mr.pay_date DESC) rowNumber
        FROM
            mreceipt mr
        JOIN
            TABLE(get_key_id('2114109999')) gk
        ON
            (gk.key_id = mr.key_id)
    ) m
ON
    (m.rowNumber = 1)        
WHERE
    c.cons_id_no='2114109999'; 

解決策は十分ですか、それとも次の方法で問題に取り組む必要がありますか:

次のように、個別のクエリとしてコンシューマー テーブルから key_id を選択します。

SELECT key_id FROM consumer WHERE cons_id_no = '2114109999';

それを変数に格納し、その値を上記のクエリ内で使用します。

4

1 に答える 1

0

あなたのソリューションは現在、各消費者 ID に関連付けられた key_ids のテーブルを作成しています。最新のものだけが必要な場合は、他のスレッドの答えが正しいです。請求表と支払い表から最新の値を集計しているため、順序付けられた表でのサブクエリ結合が最善の方法です。

請求書と支払いのテーブルからデータ全体を取得するという意味がわかりません。テーブル全体のスキャンを意味する場合は、適切なインデックス作成および/またはパーティション化によってこれを軽減する必要があります。

元帳を、消費者によるすべての請求書と支払いの完全なリストにするつもりですか? あなたの質問は、あなたが最新のものだけを気にしているという印象を与えます。

于 2013-04-01T17:34:09.670 に答える