我的目标是查看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';
--------------------------- UPDATE
嗨,大家好,任何人都可以帮助我,我怎么可能总结一下,我可以使用什么语法来汇总生成的条目。感谢。
答案 0 :(得分: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 function based indexes,就像这样:
CREATE INDEX IDX_BILLINGDATE_TRUNC_MM ON BILLING(TRUNC(BILLINGDATE,'MM'));
因为这将显着提高连接性能。
此外,根据手头数据的数量,您可以阅读partitioning。
推荐阅读