【问题标题】:Sub-Queries in NetezzaNetezza 中的子查询
【发布时间】:2014-02-21 10:49:21
【问题描述】:

我正在尝试将 SQL 从 Oracle 11 G 移植到 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 重写此查询?请帮忙。

【问题讨论】:

  • 您确定您的select 子句(PRIORSCORE) 中的子查询不返回多行吗?
  • 请找到您的答案here。您不能在 SELECT 列表中使用相关子查询。
  • Maheswaran Ravishankar 是的,我知道我不能使用相关子查询,但是如何为 Netezza 重写?
  • 您的问题在这里得到解答了吗,还是您还有问题?

标签: oracle netezza


【解决方案1】:

我建议将您的代码重写为:

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')

【讨论】:

    【解决方案2】:

    根据 Netezza Docs

    • 您不能在 SET 操作中使用相关子查询(UNIONINTERSECTEXCEPTMINUS)。
    • 您不能在具有GROUP BYHAVING 子句的聚合中使用相关子查询。
    • 您不能在 ORed 子句或 CASE/WHEN 表达式中使用相关子查询。
    • 您不能在IN 列表中使用相关子查询。
    • 您不能在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, 
        (d1.SCOREDATE)-28 as PRIORSCOREDT,
        d1.REMCD
    FROM 
        STUDENT_SCORES d1
    LEFT JOIN STUDENT_SCORES d2
    ON (d2.ID=d1.ID and d2.SCOREDATE = (d1.SCOREDATE)-28 and d1.COURSE=d2.COURSE)
    WHERE 
        d1.TEACHERID='T1' AND d1.SCOREDATE=(SELECT MAX(d3.SCOREDATE) FROM STUDENT_SCORES d3 WHERE d3.TEACHERID='T1')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多