0

私の目的は、2012 年 9 月の未払いの請求書を表示することです。

create view Viewe as
  select companyname,salutation,firstname,lastname, billingadd, billing.latestatus
  from CUSTOMER, CUST_NONRES, BILLING
  where cust_nonres.customerid = billing.custid
  and to_date(to_char(billingdate, 'MON-YYYY')) = to_date('092012', 'MON-YYYY')
  and PAID = 'NO';

ビューから*を選択したときのエラーは次のとおりです

ORA-01858: 数値が予期される場所に数値以外の文字が見つかりました. 入力データには、形式モデルで必要な数値が含まれていませんでした。*処置: 入力データまたは日付形式モデルを修正して、要素の数とタイプが一致するようにしてください。その後、操作を再試行してください。

ご協力いただきありがとうございます。


私はそれを次のように変更しました:

create view Viewe as
select companyname,salutation,firstname,lastname, billingadd, billingdate, billing.latestatus, amount
from CUSTOMER, CUST_NONRES, BILLING
where cust_nonres.customerid = billing.custid
and customer.customerid = cust_nonres.customerid
and TRUNC(billingdate, 'MM') = to_date('092012', 'MMYYYY')
and PAID = 'NO';

- - - - - - - - - - - - - - アップデート

こんにちはみんな、誰でも私を助けることができますか、どうすればそれを要約できますか、生成されたエントリを合計するためにどの構文を使用できますか. ありがとう。

4

1 に答える 1

1

これを試してください

create view Viewe as
select companyname,salutation,firstname,lastname, billingadd, billing.latestatus
from CUSTOMER, CUST_NONRES, BILLING
where cust_nonres.customerid = billing.custid
and TRUNC(billingdate, 'MM') = to_date('092012', 'MMYYYY')
and PAID = 'NO';

これにより、日付エラー メッセージの問題が修正されます。

背後にあるロジックは、TRUNC関数が日付 (したがって名前) を指定されたフィールドに切り詰めることです。文字列に変換してから日付に戻すよりもはるかに高速です。

ただし、悪い結果が得られます!!! 3 つのテーブルがあり、それらの間の接続を指定する式は1つだけです! これにより、非常に奇妙な結果が得られます (指定されていないリンクによるデカルト積による重複)。また、構文を使用することをお勧めしJOIN ONます。これは、はるかに読みやすいためです (とにかくオプティマイザーが処理します)。

create view Viewe as
select companyname,salutation,firstname,lastname, billingadd, billing.latestatus
from CUSTOMER
JOIN CUST_NONRES ON cust_nonres.customerid = customer.customerid --this is just a guess
JOIN BILLING ON cust_nonres.customerid = billing.custid
where 
and TRUNC(billing.billingdate, 'MM') = to_date('092012', 'MMYYYY')
and PAID = 'NO';

私はこのようにクエリを書いているので、テーブルを結合するための適切な式を追加することを忘れたことはありませんが、テーブルを結合するために WHERE 句を使用すると、時々間違いを犯してしまい、間違いを見つけるのに時間がかかることもありました。

また、このような多数の結合を行う場合は、次のようなOracle 関数ベースのインデックスの使用を検討する必要があることに注意してください。

CREATE INDEX IDX_BILLINGDATE_TRUNC_MM ON BILLING(TRUNC(BILLINGDATE,'MM'));

これにより、結合のパフォーマンスが大幅に向上します。

また、手元のデータの量によっては、パーティショニングについて調べることもできます。

推奨読書

于 2012-11-23T09:33:33.900 に答える