본문 바로가기
Database

Mysql 서브쿼리 별칭을 where에서 사용하는 방법 [Unknown column '별칭' in 'where clause'에러]

by GoodDayDeveloper 2020. 9. 23.
반응형

Mysql 별칭을 where에서 사용하는 방법

 

Select List 쿼리중에서 서브쿼리로 별칭을 만들어서 사용하려했지만 계속해서 에러가 나타납니다..

에러문구는 언제봐도 정이 안가네요

 

Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'cs_state_name' in 'where clause'

 

 

한마디로 별칭을 인식하지 못하는 겁니다.

 

 

그래서 구글링으로 이리저리 찾아봤지만 해결책중 2가지 경우가 있었습니다.

 

1.     Where절 대신 Having절 사용

2.     from문에서 서브쿼리한 다음 별칭 사용

 

하지만 workbench에서는 실행이되는대도 불구하고 프로그램에서는 인식하지 못했습니다.

 

 


 

그래서 지인에게 물어봐서 해결한 해결 방법을 밑에서 정리해 보았습니다.

 

1.     From 뒤에 서브쿼리로 감싸서 별칭한다.

2.     where에서는 별칭을 사용하지 않고 조건을 사용한다.

 

이렇게 말로만 정리하면 잘 모르니 코드로 정리해보겠습니다.

  

XML

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<select id="List" parameterType="ListVO"  resultType="ListVO">
    SELECT 
        *
    FROM 
    (SELECT 
        *
        ,(select name from tbl_common where num = '74' and type='1' and state = code) as state_name
        ,(select name from tbl_common where num = '78' and type='2' and state = code) as state_name2
        ,(select name from tbl_common where num = '82' and type = code) as cs_type_name
    FROM ListVO) as x
        where 
          1=1
        <if test="search != null and search !=''">
            <![CDATA[ 
            AND  #{search} = (select name from tbl_common where num = '74' and type='1' and state = code) // 별칭말고 조건 적용
            or  #{search} = (select name from tbl_common where num = '78' and type='2' and state = code)  // 별칭말고 조건 적용
             ]]>
        </if>
<![CDATA[            
    Order by cs_idx desc
    LIMIT #{recordCountPerPage} OFFSET #{firstIndex}
]]>                
</select>
cs

 

 

 

JSP (검색 SELECT BOX)

 

조건이 두가지기에 중첩 조건을 사용하였더니 적용이 되더라구요..

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<div class="form-group">
<label class="control-label" for="">진행상태</label>
<select id="search" name=search style="width:150px" class="form-control">
<option value="">선택</option>
<c:forEach var="list" items="${selectList}" varStatus="status">
    <option value="${list.state_name} ${list.state_name2}" 
    <c:choose>
        <c:when test="${searchVO.search eq list.state_name}">
            selected                                
        </c:when>
        <c:otherwise>
            <c:choose>
        <c:when test="${searchVO.search eq list.state_name2}">
            selected                                
        </c:when>
        <c:otherwise>
        </c:otherwise>
    </c:choose>
        </c:otherwise>
    </c:choose>
    >${list.state_name}${list.state_name2}</option>
</c:forEach>
</select>
</div>
cs

 

반응형

댓글