Oracle Netezza中的子查询

Oracle Netezza中的子查询,oracle,netezza,Oracle,Netezza,我正在尝试将一个SQL从Oracle11g移植到Netezza 以下是我在Oracle中的查询: SELECT ID, TEACHERID, CLASS, SECTION, MAJOR, SUPERVISOR, COURSE, SCORE, SCOREDATE, (select SCORE from STUDENT_SCORES d2 where d2.ID=d1.ID and d2.SCOREDATE (d1.SCOREDATE)-28 and d1.COURSE=d2.CO

我正在尝试将一个SQL从Oracle11g移植到Netezza

以下是我在Oracle中的查询:

SELECT
    ID, TEACHERID, CLASS, SECTION, MAJOR, SUPERVISOR, COURSE, SCORE, SCOREDATE, 
    (select SCORE from STUDENT_SCORES d2 where d2.ID=d1.ID and d2.SCOREDATE (d1.SCOREDATE)-28 and d1.COURSE=d2.COURSE)  as PRIORSCORE, 
    (d1.SCOREDATE)-28 as PRIORSCOREDT,
    REMCD
FROM 
    STUDENT_SCORES d1
WHERE 
    TEACHERID='T1' AND SCOREDATE=(SELECT MAX(SCOREDATE) FROM STUDENT_SCORES WHERE TEACHERID='T1')
在Netezza中运行此命令时,我收到一个错误:

ERROR:  (2) This form of correlated query is not supported - consider rewriting
如何为Netezza重写此查询?请帮助。

根据Netezza

  • 不能在集合操作中使用相关子查询(
    UNION
    INTERSECT
    EXCEPT
    减号
  • 不能将相关子查询与
    GROUP BY
    具有
    子句的聚合一起使用
  • 当表达式时,不能在or子句或
    大小写
    /
    中使用相关子查询
  • 不能在列表中的
    中使用相关子查询
  • 您不能在
    SELECT
    列表中使用相关子查询。
重写的查询:(Oracle)(不确定是否使用Netezza语法)


我建议您将代码改写为:

select d1.ID, d1.TEACHERID, d1.CLASS, d1.SECTION, d1.MAJOR, d1.SUPERVISOR, d1.COURSE, d1.SCORE, d1.SCOREDATE
,d2.SCORE as PRIORSCORE
,d2.SCOREDATE as PRIORSCOREDT
,d1.REMCD
from STUDENT_SCORES d1 left outer join
(select * from STUDENT_SCORES ss where ss.SCOREDATE = (SELECT MAX(SCOREDATE)-28 FROM STUDENT_SCORES WHERE TEACHERID='T1') d2
on  d1.ID=d2.ID
and d1.COURSE=d2.COURSE
where d1.TEACHERID='T1'
and d1.SCOREDATE = (SELECT MAX(SCOREDATE) FROM STUDENT_SCORES WHERE TEACHERID='T1')

您确定
select
子句(
PRIORSCORE
)中的子查询没有返回多行吗?请查找您的答案。您不能在
SELECT
列表中使用相关子查询。Maheswaran Ravishankar是的,我知道我不能使用相关子查询,但我如何为Netezza重写它?您的问题在这里得到了回答,还是仍然有问题?
select d1.ID, d1.TEACHERID, d1.CLASS, d1.SECTION, d1.MAJOR, d1.SUPERVISOR, d1.COURSE, d1.SCORE, d1.SCOREDATE
,d2.SCORE as PRIORSCORE
,d2.SCOREDATE as PRIORSCOREDT
,d1.REMCD
from STUDENT_SCORES d1 left outer join
(select * from STUDENT_SCORES ss where ss.SCOREDATE = (SELECT MAX(SCOREDATE)-28 FROM STUDENT_SCORES WHERE TEACHERID='T1') d2
on  d1.ID=d2.ID
and d1.COURSE=d2.COURSE
where d1.TEACHERID='T1'
and d1.SCOREDATE = (SELECT MAX(SCOREDATE) FROM STUDENT_SCORES WHERE TEACHERID='T1')