0

尝试执行 SQL SELECT 语句时出现以下错误

无法执行语句。
未找到相关名称“联系人”
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'  

我得到同样的错误!

有什么建议么?

4

1 回答 1

0

(怎么样q.statusflag = 'A' ,因为您似乎正在使用q别名。)这个原始答案不正确,修改为:

@Shannon Severance 在他的评论中是正确的。您正在尝试在外部查询中使用 Where 子句 - 它不包含联系人表中的任何字段。让我整理您的查询以帮助您查看子查询 (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

您将需要LEFT JOINdba.contact桌子上另一个才能访问此字段(例如现在添加)。

此外,取决于您的数据库引擎 - 如果您的字段在两个表中重复,则子查询中的 SELECT * 可能会弹出这些字段,或重命名它们,或引发错误。单独运行您的内部子查询并查看它产生的内容,或使用显式字段名称而不是 *

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

于 2015-01-18T17:03:32.933 回答