查询oracle数据库,多重子查询,结果某些字段的值丢了

时间:2022-01-25 07:42:15
数据库是oracle 11g r2

查询语句:
select * from (
  select t_album_page.*, ROWNUM rn from ( 
  select t_album_final.* from V_ALBUM t_album_final where t_album_final.ID in(
  select distinct ID from ( 
  select t_album.* from V_ALBUM t_album 
  left join V_KEYWORDS t_keywords on t_album.ID = t_keywords.ALBUMID
  where PARENT_ALBUM_ID is null and ALBUM_STATUS = 3 and t_album.COLUMN_CODE in ( '679a35bff1d34ccbacea86119bbe2bd7','ef2714538c284cb181d86d0a40d5e119','d1986d9e748c4579a0572b2c51dba1c4','a8c6572924aa4480ae5c40b5dd3a8a84') 
  )
  ) order by DECADE desc 
  ) t_album_page
) where rn >= 1 and rn <= 2147483647

以上语句结果某些该有值的字段变成了空,但直接执行内层的子查询没问题。
更奇怪的是下面的语句没问题,只是内层多了join语句。
select * from (
  select t_album_page.*, ROWNUM rn from ( 
  select t_album_final.* from V_ALBUM t_album_final where t_album_final.ID in ( 
  select distinct ID from ( 
  select t_album.* from V_ALBUM t_album 
  left join V_KEYWORDS t_keywords on t_album.ID = t_keywords.ALBUMID 
  where PARENT_ALBUM_ID is null and ALBUM_STATUS = 3 and t_album.COLUMN_CODE in ( '679a35bff1d34ccbacea86119bbe2bd7','ef2714538c284cb181d86d0a40d5e119','d1986d9e748c4579a0572b2c51dba1c4','a8c6572924aa4480ae5c40b5dd3a8a84') and ( t_album.TITLE in ( '321','魔戒三(王者归来)','魔戒一(双塔)') or t_keywords.KEYWORD in ( '321') )
  )  
  ) order by DECADE desc 
  ) t_album_page 
) where rn >= 1 and rn <= 2147483647

10 个解决方案

#1


2个语句条件不一样

#2


不是条件的问题,试过了

#3


这语句。。。。。估计效率慢死了

#4


数据量很小,不必考虑性能

#5


去掉这个限制条件 
where rn >= 1 and rn <= 2147483647

#6


没看出什么问题,你内层子查询采用左连接,全是表V_ALBUM中的记录中的ID,具体不清楚你所谓的空值是什么样的

不知道是不是你这个条件造成的t_keywords.KEYWORD in ( '321') ,试试在第二个SQL中去掉该条件呢

另外,你数据量很小,没必要加这个条件where rn >= 1 and rn <= 2147483647

#7


空值 是说结果中大部分应该有值的字段都变成了空

#8


不好意思,有问题的语句应该是下面的,开始的帖子贴错了

select * from (
  select t_album_page.*, ROWNUM rn from ( 
  select t_album_final.* from V_ALBUM t_album_final where t_album_final.ID in(
  select distinct ID from ( 
  select t_album.* from V_ALBUM t_album 
  where PARENT_ALBUM_ID is null and ALBUM_STATUS = 3 and t_album.COLUMN_CODE in ( '679a35bff1d34ccbacea86119bbe2bd7','ef2714538c284cb181d86d0a40d5e119','d1986d9e748c4579a0572b2c51dba1c4','a8c6572924aa4480ae5c40b5dd3a8a84') 
  )
  ) order by DECADE desc 
  ) t_album_page
) where rn >= 1 and rn <= 2147483647

#9


引用楼主 asand1 的回复:
数据库是oracle 11g r2

查询语句:
select * from (
  select t_album_page.*, ROWNUM rn from ( 
  select t_album_final.* from V_ALBUM t_album_final where t_album_final.ID in(
  select distinct ID from ( 
 ……






--下面的语句的条件又不一样怎么能比 

--再说看你的语句真的很冗余  整个写的这么多 你的内层查询就是你的结果 还嵌套 去重复 在查询 不想说了
--直接这样

select t.*
from (select t_album.*,row_number() over(order by DECADE desc) rn
 from V_ALBUM t_album  
  where PARENT_ALBUM_ID is null and ALBUM_STATUS = 3 and t_album.COLUMN_CODE in ( '679a35bff1d34ccbacea86119bbe2bd7','ef2714538c284cb181d86d0a40d5e119','d1986d9e748c4579a0572b2c51dba1c4','a8c6572924aa4480ae5c40b5dd3a8a84')) t 
where t.rn<=2147483647












#10


这个语句绕来绕去,好像除了里面的那一层,外面接着的几层最终查到的还不是第一层的数据?

#1


2个语句条件不一样

#2


不是条件的问题,试过了

#3


这语句。。。。。估计效率慢死了

#4


数据量很小,不必考虑性能

#5


去掉这个限制条件 
where rn >= 1 and rn <= 2147483647

#6


没看出什么问题,你内层子查询采用左连接,全是表V_ALBUM中的记录中的ID,具体不清楚你所谓的空值是什么样的

不知道是不是你这个条件造成的t_keywords.KEYWORD in ( '321') ,试试在第二个SQL中去掉该条件呢

另外,你数据量很小,没必要加这个条件where rn >= 1 and rn <= 2147483647

#7


空值 是说结果中大部分应该有值的字段都变成了空

#8


不好意思,有问题的语句应该是下面的,开始的帖子贴错了

select * from (
  select t_album_page.*, ROWNUM rn from ( 
  select t_album_final.* from V_ALBUM t_album_final where t_album_final.ID in(
  select distinct ID from ( 
  select t_album.* from V_ALBUM t_album 
  where PARENT_ALBUM_ID is null and ALBUM_STATUS = 3 and t_album.COLUMN_CODE in ( '679a35bff1d34ccbacea86119bbe2bd7','ef2714538c284cb181d86d0a40d5e119','d1986d9e748c4579a0572b2c51dba1c4','a8c6572924aa4480ae5c40b5dd3a8a84') 
  )
  ) order by DECADE desc 
  ) t_album_page
) where rn >= 1 and rn <= 2147483647

#9


引用楼主 asand1 的回复:
数据库是oracle 11g r2

查询语句:
select * from (
  select t_album_page.*, ROWNUM rn from ( 
  select t_album_final.* from V_ALBUM t_album_final where t_album_final.ID in(
  select distinct ID from ( 
 ……






--下面的语句的条件又不一样怎么能比 

--再说看你的语句真的很冗余  整个写的这么多 你的内层查询就是你的结果 还嵌套 去重复 在查询 不想说了
--直接这样

select t.*
from (select t_album.*,row_number() over(order by DECADE desc) rn
 from V_ALBUM t_album  
  where PARENT_ALBUM_ID is null and ALBUM_STATUS = 3 and t_album.COLUMN_CODE in ( '679a35bff1d34ccbacea86119bbe2bd7','ef2714538c284cb181d86d0a40d5e119','d1986d9e748c4579a0572b2c51dba1c4','a8c6572924aa4480ae5c40b5dd3a8a84')) t 
where t.rn<=2147483647












#10


这个语句绕来绕去,好像除了里面的那一层,外面接着的几层最终查到的还不是第一层的数据?