[SQL] WHERE 절에 별칭을 사용하여
SQLWHERE 절에 별칭을 사용하여
나는 나에게 최근에 충분 업데이트되지 않은 테이블 A의 행을 표시하기위한 것입니다 쿼리가 있습니다. (각 행은 "month_no"후 2개월 내에 업데이트해야합니다.)
SELECT A.identifier
, A.name
, TO_NUMBER(DECODE( A.month_no
, 1, 200803
, 2, 200804
, 3, 200805
, 4, 200806
, 5, 200807
, 6, 200808
, 7, 200809
, 8, 200810
, 9, 200811
, 10, 200812
, 11, 200701
, 12, 200702
, NULL)) as MONTH_NO
, TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
FROM table_a A
, table_b B
WHERE A.identifier = B.identifier
AND MONTH_NO > UPD_DATE
WHERE 절에서 마지막 줄에 "ORA-00904 잘못된 식별자"오류가 발생합니다. 말할 필요도없이, 내 WHERE 절에 전체 DECODE 함수를 반복하고 싶지 않아요. 이견있는 사람? (수정 및 해결 방법 모두 가능 ...)
해결법
-
==============================
1.연대순으로, WHERE 항상 실행 체인의 마지막 단계입니다 SELECT, 전에 발생하기 때문에, 직접 수 없습니다.
연대순으로, WHERE 항상 실행 체인의 마지막 단계입니다 SELECT, 전에 발생하기 때문에, 직접 수 없습니다.
당신은 그것을 하위 선택 및 필터 작업을 수행 할 수 있습니다 :
SELECT * FROM ( SELECT A.identifier , A.name , TO_NUMBER(DECODE( A.month_no , 1, 200803 , 2, 200804 , 3, 200805 , 4, 200806 , 5, 200807 , 6, 200808 , 7, 200809 , 8, 200810 , 9, 200811 , 10, 200812 , 11, 200701 , 12, 200702 , NULL)) as MONTH_NO , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE FROM table_a A , table_b B WHERE A.identifier = B.identifier ) AS inner_table WHERE MONTH_NO > UPD_DATE
정보의 흥미로운 비트는 의견에서 최대 이동 :
-
==============================
2.
SELECT A.identifier , A.name , TO_NUMBER(DECODE( A.month_no , 1, 200803 , 2, 200804 , 3, 200805 , 4, 200806 , 5, 200807 , 6, 200808 , 7, 200809 , 8, 200810 , 9, 200811 , 10, 200812 , 11, 200701 , 12, 200702 , NULL)) as MONTH_NO , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE FROM table_a A, table_b B WHERE .identifier = B.identifier HAVING MONTH_NO > UPD_DATE
-
==============================
3.또는 당신은 HAVING 절에 별칭을 가질 수 있습니다
또는 당신은 HAVING 절에 별칭을 가질 수 있습니다
-
==============================
4.그냥 당신에 대한 대안 접근 할 수있는 등 :
그냥 당신에 대한 대안 접근 할 수있는 등 :
WITH inner_table AS (SELECT A.identifier , A.name , TO_NUMBER(DECODE( A.month_no , 1, 200803 , 2, 200804 , 3, 200805 , 4, 200806 , 5, 200807 , 6, 200808 , 7, 200809 , 8, 200810 , 9, 200811 , 10, 200812 , 11, 200701 , 12, 200702 , NULL)) as MONTH_NO , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE FROM table_a A , table_b B WHERE A.identifier = B.identifier) SELECT * FROM inner_table WHERE MONTH_NO > UPD_DATE
또한 당신은 당신의 큐에 대한 영구적 인 뷰를 작성하고 뷰에서 선택할 수 있습니다.
CREATE OR REPLACE VIEW_1 AS (SELECT ...); SELECT * FROM VIEW_1;
-
==============================
5.그것은 효과적으로 선택하고 다른 조항에서 모두 사용할 수있는 변수를 정의 할 수 있습니다.
그것은 효과적으로 선택하고 다른 조항에서 모두 사용할 수있는 변수를 정의 할 수 있습니다.
서브 쿼리는 반드시 그러나 외부 적용 해, 참조 된 테이블의 컬럼에 바인딩 적절한 허용하지 않습니다.
SELECT A.identifier , A.name , vars.MONTH_NO , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE FROM table_a A , table_b B ON A.identifier = B.identifier OUTER APPLY ( SELECT -- variables MONTH_NO = TO_NUMBER(DECODE( A.month_no , 1, 200803 , 2, 200804 , 3, 200805 , 4, 200806 , 5, 200807 , 6, 200808 , 7, 200809 , 8, 200810 , 9, 200811 , 10, 200812 , 11, 200701 , 12, 200702 , NULL)) ) vars WHERE vars.MONTH_NO > UPD_DATE
에드 Mehroz 알람 했네.
from https://stackoverflow.com/questions/356675/using-an-alias-in-a-where-clause by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 당신은 어떻게 SQL Server 테이블의 기본 키를 나열합니까? (0) | 2020.03.22 |
---|---|
[SQL] IN 절을 매개 변수화를위한 JDBC를 사용하는 가장 좋은 방법은 무엇입니까? [복제] (0) | 2020.03.22 |
[SQL] SQL : 하나 개의 필드에 최소 값을 기준으로 그룹은 별개의 행을 선택하는 동안 (0) | 2020.03.22 |
[SQL] MySQL은 계산 나이 (이노) (0) | 2020.03.22 |
[SQL] 오라클에서 문자열 연결 연산자는 무엇입니까? (0) | 2020.03.22 |