SQL使用IN运算符跨两表查询报ORA-00904标识符无效错误
报错根因
你写的SQL触发ORA-00904错误的原因非常明确:外层查询是从CUSTOMER表查数据,WHERE条件里直接写了ORDER_DATE,但你自己也确认过这个字段只存在于ORDERS表,CUSTOMER表里根本没有这个字段,数据库找不到对应字段自然会报标识符无效。
而且你现在的查询逻辑本身也有问题:子查询返回的是2015-10-12这个日期值,外层相当于要在客户表里找ORDER_DATE等于这个日期的记录,完全没把两张表通过共有的CUSTOMER_NUM字段关联起来,就算字段存在也查不出正确结果。
符合题目要求的正确SQL
题目明确要求用IN运算符实现,结合你给出的表结构,正确写法如下:
SELECT CUSTOMER_NUM, CUSTOMER_NAME FROM CUSTOMER WHERE CUSTOMER_NUM IN ( SELECT CUSTOMER_NUM FROM ORDERS WHERE ORDER_DATE = DATE '2015-10-12' );
写法说明:
- 外层WHERE条件改用两张表都有的
CUSTOMER_NUM做IN匹配,这个字段在CUSTOMER表真实存在,不会再触发字段找不到的报错 - 子查询先筛出2015年10月12日所有订单对应的客户编号,外层匹配到这些编号的客户就是你要找的目标群体
- 日期条件用Oracle标准的
DATE 'YYYY-MM-DD'字面量写法,不会因为数据库默认日期格式配置和你写的'12-OCT-15'不匹配,触发你之前碰到的字面量相关报错
写IN子查询的小提示
以后写这类IN嵌套查询记住两个基本规则就行:
- IN运算符左边的字段,必须是外层查询当前FROM表中真实存在的字段
- 子查询返回的字段,必须和左边的字段数据类型、业务含义一致,不能乱匹配字段
内容的提问来源于stack exchange,提问作者krasi
相关产品推荐
相关产品推荐

