2 lixin41658133 lixin41658133 于 2016.09.21 16:02 提问

Oracle下面LEFT JOIN时提示列不能外部联接到子查询

我想得到的是从表B中取跟表A某些字段相同,但是日期是小于表A的日期的最大的一条记录。
我之前测试的时候使用如下数据:
表A
图片说明
表B
图片说明
然后写法是:
select * from z_test1 a left join z_test2 b
on a.name1= b.name1
and b.erdat1 = (select max(erdat1) from z_test2 b1
where b1.name1 = a.name1
and b1.erdat1 < a.erdat)

这样没有报错,是有结果的:
图片说明

但实际在视图中使用此语句时:
图片说明
却提示列不能外部联接到子查询的错误。
请教一下为什么会报错?或者有没有什么其他的写法?

5个回答

zhuzige521888
zhuzige521888   2016.09.21 17:35

错误挺奇怪的,不过可以用另外方法解决,就是把 and b.erdat=子查询 这块筛选放在 on时,即一开始就帅选出符合子查询的数据再连接。

lixin41658133
lixin41658133   2016.09.21 21:09

这个好像不行啊。因为没有办法在一开始就筛选出来。要根据表a的日期来定的。

lixin41658133
lixin41658133   2016.09.21 21:40

我尝试了这样写:
select * from z_test1 a left join z_test2 b
on a.name1= b.name1
where b.erdat1 = (select max(erdat1) from z_test2 b1
where b1.name1 = a.name1
and b1.erdat1 < a.erdat)
但这样写的话,左联接为空的就取不到了。 _

lixin41658133
lixin41658133   2016.09.21 23:41

我发现正常查询可以,但一旦要写到创建视图的语句中,就会报错,不知道这是为什么。

lixin41658133
lixin41658133   2016.09.21 23:41

图片说明

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
oracle查询列不能外部连接到子查询
解决办法:将条件写在where 后面
ORA-01799 列不能外部联接到子查询
需求及问题 在一些表关联查询中,当存在源表和关联表都有过虑条件(and)时,如果其中一个条件不符合,结果就有可能为空; 而实际上我们要求结果集中,条件不符合的显示空,但其它条件正常的,依然要显示。 1.要达到目的,不符合的数据显示为空,符合的照常显示 2.直接在where里放入条件,当有一个不符合时,结果集可能为空 /*需求和问题*/ /*1.where中放两个查询条件,有可
Oracle中子查询与Join性能比较
在PL/SQL  Developer中,打开一个SQL窗口,粘入sql语句,按F5,可以看到该sql语句的解释计划。在解释计划窗口里,耗量这一项指标越小,说明执行得越快。 通过比较20万数据量(主表)的情况下,子查询的方式比Join差不多快一倍。
oracle sql 多表 嵌套子查询 连接查询, join where exist in 的区别
sql中exits和in的区别 转:http://hi.baidu.com/delphi_relive/blog/item/d7c0034a49c4932208f7ef21.html in 和 exists也是很好区别的. in 是一个集合运算符. a in {a,c,d,s,d....} 这个运算中,前面是一个元素,后面是一个集合,集合中的元素类型是和前面的元素一样的. 而ex
SQL改写, 聚合语句, left join 改写标量子查询
最近遇到一个SQL 改写, 其实改写难度一般,但连续强调用 left  join  改写标量子查询,   不知道为何 如此多的标量子查询 案例 说明: 为了公司机密, 所以用scott 用户表示   select d.*, (select count(*) from scott.emp) cnt1,      (select count(*) from scott.emp p
多表连接子查询;left join、right join、inner join的区别
学习视频   :http://v.youku.com/v_show/id_XMTY5ODQwMDg0.html?firsttime=7026 一、笛卡尔积(无实用意义)   二、表连接查询: ①等值连接 语法格式: Select 字段列表 From table1 a,table2 b Where table1.column1 = table2.column2 AND 。。。;
oracle left join 查询on中出现and条件
结论: 在使用LEFT JOIN时,右表的限制条件,在ON和WHERE字句中出现,逻辑上的语义完全不同。 过滤条件在ON子句中出现时,不会改变原来LEFT JOIN的执行语义:以左表为基表。 过滤条件在WHERE字句中出现时,已经改变了原来LEFT JOIN的语义,相当于在最后LEFT JOIN的结果集里面再做了一次WHERE条件的过滤,所以已经丧失的LEFT JOIN的原始语义。 性能上
mysql 优化-子查询和left join(一)
今天针对一个mysql做优化 具体如下设计到几张表 商品表: goods 会员消费表:member_consumes 会员表: members 会员标签表member_label 分组标签表: group_label 大体功能是这样的在分组营销的分组数据下面查看会员消费前十的商品是哪些 比如:在孕妇装分组下面会员买的最多的是那些牌子的商品 之前的sql语句是这样的SELEC
sql查询--join与子查询对比
一般来说数据库查询最好不要用join查询,因为比较慢,但是与子查询相比,join的查询效率还是比子查询高的,个人建议,不要用子查询! 原因是从网上找到的,可以参考:因为使用子查询时,数据库还要建一张临时表,所以效率才会比左连接来得慢(刚开始还以为没准回和索引有关系,事实证明我错了) SQL中查询的一些对比情况总结: select xxx  from A  where xx = (se
Mysql 的连接(join)和子查询
连接(JOIN)和子查询 子查询一般是将查询出来的结果作为其他查询的结果使用。例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来,然后将结果传递给主查询,如下所示:  DELETE FROM customerinfo  WHERE CustomerID NOT in (SELECT CustomerID FROM s