2017-07-26 75 views
0

我在下面的查询中遇到错误。你可以帮我吗?MyBatis SQL查询中含糊不清的列

错误是由不明确的列引起的。我有一个想法,我不确定。

我认为错误是在这里WorkUID列(暧昧):

<isNotEmpty property="uids"> 
    AND WorkUID IN 
    <iterate property="uids" open="(" close=")" conjunction=","> 
     #uids[]# 
    </iterate> 
    </isNotEmpty> 

以下是错误:

Cause: SqlMapClient operation; SQL []; 
--- The error occurred while applying a parameter map. 
--- Check the getData-InlineParameterMap. 
--- Check the statement (query failed). 
--- Cause: java.sql.SQLException: Ambiguous column name 'WorkUID'.; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException: 
--- The error occurred while applying a parameter map. 
--- Check the getData-InlineParameterMap. 
--- Check the statement (query failed). 
--- Cause: java.sql.SQLException: Ambiguous column name 'WorkUID'.; 
net.extraction.etl.exception.DAOException: Getting work UID by release datetime. 
Cause: org.springframework.dao.TransientDataAccessResourceException: SqlMapClient operation; SQL []; 
--- The error occurred while applying a parameter map. 
--- Check the getData-InlineParameterMap. 

下面是该查询:

<select id="getData" resultClass="java.lang.Integer" parameterClass="java.util.Map" > 
    <![CDATA[ 
      SELECT xrn.WorkUID 
      FROM 
      (SELECT uow.WorkUID, 
       ROW_NUMBER() OVER(PARTITION BY wsh.WorkUID ORDER BY wsh.DT DESC) AS rnk 
      FROM UnitWork uow 
      INNER JOIN SigHist sh ON sh.SigUID = uow.SigUID 
      INNER JOIN DataCell d ON d.WorkUID = uow.WorkUID 
      INNER JOIN WorkStatHist wsh ON (wsh.WorkUID = uow.WorkUID 
               AND wsh.WorkUID = d.WorkUID 
                  AND 8 = 
                (SELECT TOP 1 StatusUID 
                FROM WorkStatHist(NOLOCK) 
                WHERE WorkUID = uow.workUID 
                ORDER BY DT DESC)) 
     WHERE (uow.ReleasedDT > #fromDate#) 
      OR (sh.UpdatedDT > #fromDate#) 
      AND d.EffectiveTo >= GETDATE() + 1 
      ]]> 
    <dynamic> 
     <isNotEmpty property="toDate"> 
     <![CDATA[ 
         AND d.EffectiveTo < #toDate# 
        ]]> 
     </isNotEmpty> 
     <isNotEmpty property="uids"> 
     AND WorkUID IN 
     <iterate property="uids" open="(" close=")" conjunction=","> 
      #uids[]# 
     </iterate> 
     </isNotEmpty> 
    </dynamic> 
    <![CDATA[ 
    ) xrn 
      WHERE xrn.rnk=1 
     ]]> 
    </select> 
+0

这是什么语言......?显然还有一种除了SQL Server以外的语言。请适当地标记您的问题。请重命名您的标题。 – Siyual

+0

你没有这个合格的...... AND WORKUID IN。在'' –

+0

之后的Where语句中,感谢您的回复,它是一个使用mybatis编写的sql查询。 WEI_DBA,请您重新解释您在查询中发现错误的原因,因为我没有听到上面的解释。非常感谢你们 – Stephane

回答

1

我我根本不熟悉MyBatis,所以我不能说代码的那部分内容,但看起来你的问题是跟随着g部分:

<isNotEmpty property="uids"> 
    AND WorkUID IN 
    <iterate property="uids" open="(" close=")" conjunction=","> 
     #uids[]# 
    </iterate> 
</isNotEmpty> 

特别是AND WorkUID IN部分。

查询中有多个表有WorkUID作为列,所以它不知道要从哪个表中提取。 。

看到,它被用作一个JOIN约束为每个表,它并不需要特别关心我们告诉它在寻找这台

将其更改为以下应该清理的错误:

<isNotEmpty property="uids"> 
    AND uow.WorkUID IN 
    <iterate property="uids" open="(" close=")" conjunction=","> 
     #uids[]# 
    </iterate> 
</isNotEmpty> 
+0

+ 1的评论:看到它被用作每个表的JOIN约束,它并不特别关系我们告诉它看哪个表以及正确的答案。 – xQbert

+0

谢谢大家的帮助。我按照Siyual的指导修复了它。 – Stephane

+0

大家好,我可以问最后一个问题吗?我怎样才能添加一个新的条件,如:WHERE wsh.WorkUID = uow.workUID \t AND uow.WorkUID IN(55)在我的where条件中为我的SELECT TOP 1 StatusUID FROM WorkStatHist(NOLOCK)。它没有考虑到我的新情况 – Stephane