0

我的目标是查看 SEP/2012 月份尚未支付的账单

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';

当我从 viewe 中选择 * 时,这是我的错误

ORA-01858:在预期数字 01858 的地方发现了非数字字符。 00000 - “在预期数字的地方发现了非数字字符” *原因:要使用日期格式模型转换的输入数据不正确. 输入数据不包含格式模型需要数字的数字。*操作:修复输入数据或日期格式模型,以确保元素在数量和类型上匹配。然后重试该操作。

谢谢你的帮助。


我已将其更改为:

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'));

因为这将显着提高连接性能。

此外,根据手头的数据量,您可能会阅读partitioning

推荐阅读

于 2012-11-23T09:33:33.900 回答