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 名称 - 这将帮助您了解出了什么问题......否则你的查询逻辑非常好,我建议添加额外的左连接是多余的)
我在尝试执行我的 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 名称 - 这将帮助您了解出了什么问题......否则你的查询逻辑非常好,我建议添加额外的左连接是多余的)