私は3つのテーブルを持っています:
- フィールド cons_id_no、key_id を持つ消費者
- フィールドkey_id、bill_id_no、amt_payable、bill_dateを持つbm_bill(消費者の請求額と日付のすべてが含まれます)
- フィールド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';
それを変数に格納し、その値を上記のクエリ内で使用します。