【问题标题】:SQL Query gives missing parenthesis errorSQL 查询给出缺少括号的错误
【发布时间】:2013-08-24 05:09:16
【问题描述】:

我已经为此工作了几天,无法弄清楚错误出在哪里。查询是:

Select distinct p.PkgID, p.PkgName, p.PkgCost, c.CustFName || ' ' || c.CustLName as   "CUSTOMERNAME" 
FROM Subscription s, Package p, Customer c
WHERE p.PkgID = s.PkgID
AND c.CustID = s.CustID     
AND to_date 
 (s.StartDate, 'Mon DD, YYYY')=
to_date 
 (&StartDate, 'Mon DD, YYYY')
ORDER BY p.PkgID;

我不断得到:

SQL 错误:ORA-00907:缺少右括号 00907. 00000 - “缺少右括号”。

我找不到问题。任何帮助将非常感激。 下面是 table 和 insert 语句的样子。

CREATE TABLE SUBSCRIPTION
(
SubID NUMBER(5) NOT NULL CONSTRAINT SUBSCRIPTION_SubID_PK PRIMARY KEY,
StartDate DATE NOT NULL,
EndDate DATE NOT NULL,
CustID NUMBER(5) NOT NULL,   
PkgID NUMBER(5) NOT NULL  
 );

ALTER TABLE SUBSCRIPTION ADD CONSTRAINT SUBSCRIPTION_CustID_FK FOREIGN KEY (CustID)     REFERENCES CUSTOMER (CustID);
ALTER TABLE SUBSCRIPTION ADD CONSTRAINT SUBSCRIPTION_PkgID_FK FOREIGN KEY (PkgID) REFERENCES PACKAGE (PkgID);

INSERT INTO SUBSCRIPTION
VALUES (010, to_date('Jan 01, 2010 11:30','Mon DD, YYYY hh24:mi'), to_date('Jan 01,   2013 14:30','Mon DD, YYYY hh24:mi'), 00001, 10101);
INSERT INTO SUBSCRIPTION
VALUES (015,to_date('Mar 01, 2012 17:00','Mon DD, YYYY hh24:mi'), to_date('Dec 05, 2012 17:00','Mon DD, YYYY hh24:mi'), 00002, 20202);

顺便说一句,我也尝试过这种方式:

Select distinct p.PkgID, p.PkgName, p.PkgCost, c.CustFName || ' ' || c.CustLName as   "CUSTOMERNAME" 
FROM Subscription s
        Left OUTER JOIN Package p on p.PkgID = s.PkgID
    Left OUTER JOIN Customer c on c.CustID = s.CustID       
WHERE to_date (s.StartDate, 'Mon DD, YYYY')=
to_date (&StartDate, 'Mon DD, YYYY')    
ORDER BY p.PkgID;

【问题讨论】:

  • s.startdate的数据类型是什么?
  • 能否提供创建表格并在其中插入一些数据的代码?
  • S.StartDate 是一个日期。
  • @Ben,哇。老实说,我什至不记得改变标题。我完全同意你的看法。我在那个重要时刻的错误!
  • 虽然不是讨论的中心,但您确实应该使用 ANSI-92 SQL JOIN 语法。

标签: sql oracle


【解决方案1】:

TO_DATE() 的输入是两个字符串;即使您使用的是 SQL*Plus 替换变量,您仍然需要强制执行此操作。

改变

AND to_date(s.StartDate, 'Mon DD, YYYY') = to_date(&StartDate, 'Mon DD, YYYY')

AND to_date(s.StartDate, 'Mon DD, YYYY') = to_date('&StartDate', 'Mon DD, YYYY')

您确定s.StartDate 是这种格式的字符吗?听起来它已经是一个日期(我希望如此),在这种情况下您不需要TO_DATE(),但可能值得在日期上使用TRUNC() 来删除时间部分。


要根据 cmets 编辑我的答案,我认为您没有以正确的方式更改此内容。应该是:

AND trunc(s.StartDate) = to_date('&StartDate', 'Mon DD, YYYY')

注意TRUNC()' 周围的'&StartDate'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 2016-04-14
    • 2016-10-23
    • 1970-01-01
    • 2018-09-12
    相关资源
    最近更新 更多