无法绑定多部分标识符“SR_DOC_HDR.DOC_VERS_NO”

Posted

技术标签:

【中文标题】无法绑定多部分标识符“SR_DOC_HDR.DOC_VERS_NO”【英文标题】:The multi-part identifier "SR_DOC_HDR.DOC_VERS_NO" could not be bound 【发布时间】:2017-09-20 13:39:20 【问题描述】:

这是失败的查询。

失败的 SQL:

Select   SO_DOC_CD,
         SO_DOC_DEPT_CD,
         SO_DOC_ID,
         SO_DOC_VERS_NO,
         SR_DOC_CD,
         SR_DOC_DEPT_CD,
         SR_DOC_ID,
         SR_DOC_VERS_NO,
         DOC_LAST_DT,
         DOC_PHASE_CD,
         DOC_PHASE_CD_SO,
         DOC_STA_CD,
         VEND_CUST_CD,
         DOC_SH_DSCR,
         RESP_STA,
         RESP_TM_WEB,
         "Created By",
         QRY_SRCH_STRING,
         SO_DOC_REF,
         SR_DOC_REF,
         SO_DOC_FUNC_CD,
         RESP_DT_ADV,
         SO_SR_QRY.RESP_STA_ORD,
         APPL_STA_CD,
         SO_SR_QRY.APPL_STA_CD_ORD,
         SO_SR_QRY.AWD_FL
From     (
             Select SO_DOC_HDR.DOC_CD As SO_DOC_CD,
                    SO_DOC_HDR.DOC_DEPT_CD As SO_DOC_DEPT_CD,
                    SO_DOC_HDR.DOC_ID As SO_DOC_ID,
                    SO_DOC_HDR.DOC_VERS_NO As SO_DOC_VERS_NO,
                    SO_DOC_HDR.SO_CLSNG_DT As SO_CLSNG_DT,
                    SO_DOC_HDR.SO_CLSNG_TM As SO_CLSNG_TM,
                    SR_DOC_HDR.DOC_CD As SR_DOC_CD,
                    SR_DOC_HDR.DOC_DEPT_CD As SR_DOC_DEPT_CD,
                    SR_DOC_HDR.DOC_ID As SR_DOC_ID,
                    SR_DOC_HDR.DOC_VERS_NO As SR_DOC_VERS_NO,
                    SR_DOC_HDR.DOC_LAST_DT As DOC_LAST_DT,
                    SR_DOC_HDR.DOC_PHASE_CD As DOC_PHASE_CD,
                    SR_DOC_HDR.APPL_STA_CD As APPL_STA_CD,
                    SO_DOC_HDR.DOC_PHASE_CD As DOC_PHASE_CD_SO,
                    SR_DOC_HDR.DOC_STA_CD As DOC_STA_CD,
                    SR_DOC_HDR.VEND_CUST_CD As VEND_CUST_CD,
                    SO_DOC_HDR.DOC_SH_DSCR As DOC_SH_DSCR,
                    SR_DOC_HDR.RESP_STA As RESP_STA,
                    SR_DOC_HDR.RESP_TM_WEB As RESP_TM_WEB,
                    SR_DOC_HDR.DOC_CREA_USID As "Created By",
                    SR_DOC_HDR.QRY_SRCH_STRING As QRY_SRCH_STRING,
                    SO_DOC_HDR.DOC_REF As SO_DOC_REF,
                    SR_DOC_HDR.DOC_REF As SR_DOC_REF,
                    SO_DOC_HDR.DOC_FUNC_CD As SO_DOC_FUNC_CD,
                    SR_DOC_HDR.RESP_DT_ADV As RESP_DT_ADV,
                    Case When RESP_STA = 7 Then 1
                         When RESP_STA = 1 Then 2
                         When RESP_STA = 2 Then 4
                         When RESP_STA = 3 Then 3
                         When RESP_STA = 4 Then 5
                         When RESP_STA = 5 Then 6
                    End As RESP_STA_ORD,
                    Case When APPL_STA_CD = 5 Then 1
                         When APPL_STA_CD = 4 Then 2
                         When APPL_STA_CD = 1 Then 3
                         When APPL_STA_CD = 3 Then 4
                         When APPL_STA_CD = 6 Then 5
                         When APPL_STA_CD = 2 Then 6
                         When APPL_STA_CD = 7 Then 7
                    End As APPL_STA_CD_ORD,
                    Case When Exists (
                                         Select 1
                                         From   SR_DOC_COMMLN
                                         Where  SR_DOC_COMMLN.SO_DOC_ID = SR_DOC_HDR.SO_DOC_ID
                                                And SR_DOC_COMMLN.SO_DOC_DEPT_CD = SR_DOC_HDR.SO_DOC_DEPT_CD
                                                And SR_DOC_COMMLN.SO_DOC_VERS_NO = SR_DOC_HDR.SO_DOC_VERS_NO
                                                And SR_DOC_COMMLN.SO_DOC_CD = SR_DOC_HDR.SO_DOC_CD
                                                And (
                                                        SR_DOC_COMMLN.AWARD_CREATED = 1
                                                        Or SR_DOC_COMMLN.AWARD_FINALIZED = 1
                                                    )
                                     ) Then 1
                         Else 0
                    End As AWD_FL
             From   av3112jm1.dbo.SR_DOC_HDR SR_DOC_HDR,
                    av3112jm1.dbo.SO_DOC_HDR SO_DOC_HDR
             Where  SO_DOC_HDR.DOC_CD = SR_DOC_HDR.SO_DOC_CD
                    And SO_DOC_HDR.DOC_DEPT_CD = SR_DOC_HDR.SO_DOC_DEPT_CD
                    And SO_DOC_HDR.DOC_ID = SR_DOC_HDR.SO_DOC_ID
                    And SO_DOC_HDR.DOC_PHASE_CD = 3
         ) SO_SR_QRY
Where    1 = 1
         And (
                 SR_DOC_HDR.DOC_VERS_NO = 1
                 And SR_DOC_HDR.DOC_DEPT_CD = '010'
                 And SR_DOC_HDR.DOC_CD = 'GFA'
                 And SR_DOC_HDR.DOC_ID = 'ESR09141700000000002'
             )
Order By Case When SO_DOC_FUNC_CD = 3 Then 4
              When SO_SR_QRY.AWD_FL = 1 Then 2
              When Convert(DateTime, SO_CLSNG_DT, (108)) + Convert(DateTime, SO_CLSNG_TM, 114) <= '2017-09-20 02:44:23' Then 3
              Else 1
         End Asc,
         SO_CLSNG_DT Desc,
         SO_CLSNG_TM Desc;

【问题讨论】:

这是怎么回事? 任何与此错误相关的内容都会有所帮助 【参考方案1】:

问题是在您的外部查询中,您引用了SR_DOC_HDR.DOC_VERS_NO = 1,但您的内部查询将该列别名为SR_DOC_VERS_NO

您需要使用内部查询中给出的别名。

将您的外部WHERE 语句更改为:

Where    1 = 1
     And (
             SR_DOC_VERS_NO = 1
             And SR_DOC_DEPT_CD = '010'
             And SR_DOC_CD = 'GFA'
             And SR_DOC_ID = 'ESR09141700000000002'
         )

【讨论】:

+1,只是一个小问题,您是否使用过任何东西来自动格式化查询?这是什么?? @DarwinThorburn 是的,我使用 Redgate SQL Prompt 对其进行格式化。还有其他免费的查询格式替代方案,例如Poor Man's SQL Formatter。 谢谢你【参考方案2】:

在您的子查询中,您使用了两倍的别名

sr_doc_hdr.doc_vers_no AS SR_DOC_VERS_NO

【讨论】:

SR_DOC_HDR_DOC_ID 和 doc_dept_cd 也有 .. 那么为什么错误是针对 doc_vers_no 的,而且它只针对 sql server 而不是针对 oracle 任何 cmets 造成的问题 这是两个不同的列(注意 so_sr_

以上是关于无法绑定多部分标识符“SR_DOC_HDR.DOC_VERS_NO”的主要内容,如果未能解决你的问题,请参考以下文章

协助 SQL 查询 - 无法绑定多部分标识符

无法绑定多部分标识符“alias.field”

多部分标识符无法绑定更新列

SQL 错误:无法绑定多部分标识符

无法绑定多部分标识符“p.ProductID”

无法绑定多部分标识符 - 子查询