Sql 此语句中的子查询在哪里?
以下代码返回ORA-01427:单行子查询返回多行,但我无法确定发生这种情况的原因。此语句的哪个部分被视为子查询Sql 此语句中的子查询在哪里?,sql,oracle,subquery,Sql,Oracle,Subquery,以下代码返回ORA-01427:单行子查询返回多行,但我无法确定发生这种情况的原因。此语句的哪个部分被视为子查询 SELECT ada.schoolid, s.dcid, s.lastfirst, s.grade_level, s.home_room, s.home_phone, SUM(ada.membershipvalue) - SUM(ada.attendancevalue) absences, SUM(ada.members
SELECT
ada.schoolid,
s.dcid,
s.lastfirst,
s.grade_level,
s.home_room,
s.home_phone,
SUM(ada.membershipvalue) - SUM(ada.attendancevalue) absences,
SUM(ada.membershipvalue) membership,
ROUND( ( SUM( ada.membershipvalue ) - SUM(ada.attendancevalue) ) / SUM( ada.membershipvalue ) * 100, 2) absenceRate
FROM
students s
JOIN schools schl ON schl.school_number = s.schoolid
JOIN ps_adaadm_defaults_all ada ON ada.studentid = s.id and ada.schoolid in (87)
WHERE
s.pl_language = '31516argul'
AND to_date(ada.calendardate) >= to_date('9/01/2007', 'mm/dd/yyyy')
AND to_date(ada.calendardate) <= to_date('6/20/2016','mm/dd/yyyy' )
AND ada.membershipvalue > 0
GROUP BY
ada.schoolid,
s.dcid,
s.lastfirst,
s.grade_level,
s.home_room,
s.home_phone
ORDER BY
s.lastfirst ASC
你有两个选择。根据您在注释中的解释,无论您使用何种代码生成87都不太可能导致问题,或者ps_adaadm_defaults_all导致问题。发布视图定义后,我们可以找出如何修复它,但实际情况是,您的db正在选择一个执行计划,该计划通过以不同顺序连接表来破坏该视图 由于您没有发布和采样输出数据……我们对您的数据视而不见 我相信87年的ada.schoolid不应该加入声明。 尝试在where子句下移动它
where ada.schoolid in (87)
AND s.pl_language = '31516argul'
AND to_date(ada.calendardate) >= to_date('9/01/2007', 'mm/dd/yyyy')
AND to_date(ada.calendardate) <= to_date('6/20/2016','mm/dd/yyyy' )
AND ada.membershipvalue > 0
您是通过学校ID将学生加入学校,而不是将学校加入ps_adaadm_默认值_all?然而,在87年,你将ps_adaadm_默认值全部限制为schoolid。这似乎不一致-您正在从第一次联接获取所有schoolid的所有学生记录,然后ps_adaadm_defaults_schoolid=87的所有值正在用于学校中的所有schoolid。这些都是表吗?还是您在使用某些视图?。这就是全部代码吗?@Lamak ps\u adaadm\u defaults\u all是一个视图。这是全部代码。你能从ps\u adaadm\u defaults\u all中选择*吗?这就是你正在运行并得到错误的代码吗?87总是这样硬编码的吗?你能把这个视图的定义也贴出来吗。虽然不太可能,但我见过视图内部的某些奇怪情况会导致连接方式出现意外错误的情况。哪个表具有多行数据作为唯一id?Oracle通常不关心内部连接,并且会使用相同的计划和访问/筛选谓词;无论如何,它都会在内部以旧语法重写。我想,如果这种观点以某种方式导致了问题,那么它可能会产生一些影响;我对此表示怀疑,但检查一下会很有趣。我相信其中一个表有多行数据,是不同的'ada.schoolid';我想了解更多关于表格数据的信息。ada.studentid=s.id仍将间接限制为单个学校。或至少对与该学校有联系的所有学生;我想一个学生可能会被列在不止一所学校的名单上。这并没有解决所看到的错误,尽管这可能会影响Oracle如何在内部重写查询以处理显然非常复杂的视图。也许这只会影响那些有其他学校学生的学校。