SQL SELECT 语句中使用 OVER 和 PARTITION 的关联错误

SQL Correlation error using OVER & PARTITION in SELECT statement

我在尝试执行我的 SQL SELECT 语句时遇到以下错误

无法执行语句。
找不到关联名称 'contact'
SQLCODE=-142,ODBC 3 状态“42S02”
第 1 行,第 1 列

我的代码如下

Select forename, surname, email, quotedate
From ( SELECT  *, ROW_NUMBER() OVER (PARTITION BY tblQuote.contno ORDER BY quoteno DESC) AS rn
FROM dba.quotehdr as tblQuote left join dba.contact as tblContact on tblQuote.contno = tblContact.contno)q
where rn = 1 and quotedate <=today()-720 and emailbounced = 0 and email is not null and dba.contact.statusflag = 'A'
order by quotedate desc

只有在我添加时才会出现这个错误

dba.contact.statusflag = 'A'

我试过这个

tblContact.statusflag = 'A'  

我得到了同样的错误!

有什么建议吗?

(那 q.statusflag = 'A' 呢,因为您似乎正在使用 q 作为别名。)原答案不正确,修改为:

@Shannon Severance 的评论是正确的。您正在尝试在外部查询上使用 Where 子句 - 它不包含来自联系人 table 的任何字段。让我整理您的查询以帮助您查看子查询 (q) - 如:

Select 
  forename
  ,surname
  ,email
  , quotedate
From 
  (
    SELECT 
      *
      , ROW_NUMBER() OVER (PARTITION BY tblQuote.contno ORDER BY  quoteno DESC) AS rn
    FROM dba.quotehdr as tblQuote 
    left join dba.contact as tblContact on tblQuote.contno = tblContact.contno
  ) q
left join dba.contact as tblContact on q.contno = tblContact.contno
where rn = 1 
  and quotedate <=today()-720 
  and emailbounced = 0 
  and email is not null 
  and tblContact.statusflag = 'A' -- Now sourced from last left join

order by quotedate desc

您需要 dba.contact table 上的另一个 LEFT JOIN 才能访问此字段(例如,现在添加)。

此外,根据您的数据库引擎 - 如果您的字段在两个 table 中重复,子查询中的 SELECT * 可能会弹出这些字段,或重命名它们,或抛出错误. 运行 你的内部子查询本身,看看它产生了什么,或者使用显式字段名而不是 *

(我仍然真的认为子查询中的 * 导致错误和混乱。删除它并替换为 table.field 名称 - 这将帮助您了解出了什么问题......否则你的查询逻辑非常好,我建议添加额外的左连接是多余的)