【问题标题】:SQL Correlation error using OVER & PARTITION in SELECT statement在 SELECT 语句中使用 OVER 和 PARTITION 的 SQL 相关错误
【发布时间】:2015-01-18 16:54:49
【问题描述】:

当我尝试执行我的 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'  

我得到同样的错误!

有什么建议吗?

【问题讨论】:

  • 组成子查询q的单独表仅在该子查询中可见。在子查询之外,所有的列都只属于q
  • 确定您使用的是 Oracle 吗?这有点不对劲......你不能使用AS 来给表起别名; TODAY() 不是一个有效的函数(它是SYSDATE)并且不需要括号;如果您选择 * 和其他列,您需要为其加上别名,即 tablequote.*(请不要这样做,只选择所需的列)并且您引用 statusflag 超出范围,为什么要指定当您不从中选择时,该表?如果您的 SELECT 中有多个具有该名称的列,则会导致更多错误。
  • -00142 似乎不是有效的 Oracle 错误消息,您确定这是正确的错误号吗?
  • “Adaptive Server Anyhwere”是不是 Oracle
  • 据我所知,它是一个 Oracle 系统。 Adaptive Server Anywhere 9。我还在交互式 SQL/Infomaker 中编写 SQL 脚本。

标签: sql window-functions sybase-asa


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,我试过了,但没用。 Statusflag 也出现在两个表中,所以我尝试了 q.contact.statusflag,没有任何乐趣。
  • 非常感谢我应该把我的第二个 LEFT JOIN 放在哪里
  • @JonathanGriffin 我会在您的子查询 q 之后和 WHERE 子句之前添加它。 (但是,我仍然认为您可以使用子查询来消除 * 并且这也可以解决问题)我将使用左连接来调整我的答案 - 因为我没有测试它,所以语法可能会关闭。
猜你喜欢
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 2016-02-11
  • 1970-01-01
相关资源
最近更新 更多