2014-07-09 2 views
0

SQL 합류를 선택합니다.오라클 SQL 컬럼

WITH 절을 사용할 때 조인 된 열을 어떻게 선택합니까? 별칭을 붙이며 접두사를 쓰고 아무 것도 효과가 없었습니다. 나는 내가 사용할 수있는 것을 안다 :

WITH joined AS (
    SELECT a.a_id 
    FROM table_a a 
    JOIN table_b b ON (a.a_id = b.a_id) 
) 
SELECT a_id 
FROM joined 

그러나 나는 모든 필드를 포함하기 위해이 별칭이 필요하다.

는 유일한 방법 나는이 조건이 사용에 맞게 관리 :

WITH joined AS (
    SELECT a.a_id a_id_alias, a.*, b.* 
    FROM table_a a 
    JOIN table_b b ON (a.a_id = b.a_id) 
) 
SELECT a_id_alias 
FROM joined 

을하지만 난 당신이 별칭없이이 작업을 수행 할 수 있다고 생각하지 않습니다 그것은 ...

+1

CTE가 완전히 불필요하기 때문에 이것이 실제 쿼리가 아닙니다. –

+0

필자가 필요로하는 최소한의 예 : –

답변

4

사용하지 않는 것이 좋습니다. 당신은 (그것이 당신의 예제의 경우와 같이) 열이 같은 이름을 가진 조인 테이블에 가입하면

USING 절은 다음 작품 있도록 한 번만 열을 조인 반환합니다

with joined as (
    select * 
    from table_a a 
    join table_b b using (a_id) 
) 
select a_id 
from joined; 

SQLFiddle 예제 : http://sqlfiddle.com/#!4/e7e099/2

+0

그게 좋네요. 당신이 그걸 할 수 있는지 전혀 몰랐습니다. – Hambone

+0

"사용"에 관한 많은 문서가 아닙니다. 검색을 할 때 키워드보다 동사로 더 자주 등장합니다. 하나의 잠재적 함정을 볼 수 있습니다. 두 테이블 조인 이상인 경우에도 잘 작동하지만 세 개 이상의 테이블에서 쿼리하는 경우 실제 조인이 발생하는 위치를 추상화 할 수 있습니다. 여전히 OP의 질문에 repitoire와 "완벽한"솔루션을 추가하는 아주 좋은 도구입니다. – Hambone

+1

'using' 절은 설명서 (http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_10002)에 설명되어 있습니다.htm # i2080416 (수동으로 외부 조인에 대해 이야기 할 때 동작은 다소 암시 적으로 설명됩니다. http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_10002.htm#SQLRF55323 –

2

완벽한 해결책이 아니다. "조인 된"쿼리의 결과에는 두 개의 필드 (모두 a_id)가 있습니다. 별칭이 아닌 한 (또는 둘다) 마지막 쿼리 에서처럼 외부 쿼리는 어느 a_id를 참조하는지 알지 못합니다.

최종 쿼리가 "완벽한"솔루션이 아닌 이유는 무엇입니까?

+2

'SELECT *'는 일반적으로 게으른 접근 방식으로 간주됩니다. 필요한 필드를 모두 나열하더라도 그냥 나열하면됩니다. – ninesided

+0

모든 열이 필요하면 성능상 별표를 사용하지 않는 것이 좋습니다. 항상 더 좋은 솔루션을 찾는 습관이 있기 때문에 완벽하다고 생각하지 않았습니다. –

+0

실제로 별칭을 사용하지 않고 수행 할 수 있지만 조인 열의 이름이 같은 경우에만 수행합니다 (문제가 발생하지 않는 경우). –

0

당신은 아마 다음과 같이 별칭을 사용할 수 있습니다

WITH JOINED AS (
    SELECT A.A_ID A_A_ID, B.A_ID B_A_ID, 
    A.FIELD_NAME1 A_FIELDNAME1, A.FIELDNAME2 A_FIELDNAME2,A.FIELDNAME_N A_FIELDNAME_N, 
    B.FIELD_NAME1 B_FIELDNAME1, B.FIELDNAME2 B_FIELDNAME2,B.FIELDNAME_N B_FIELDNAME_N, 
    FROM TABLE_A A 
    JOIN TABLE_B B ON (A.A_ID = B.A_ID) 
) 
SELECT A_A_ID, B_A_ID 
FROM JOINED 

IT는 항상 테이블을 조인 할 때 당신은 USING 조항의 효과를 사용할 수 있습니다 SELECT *

+0

질문의 세 번째 쿼리가 이미이 작업을 수행하지 않았습니까? –

+0

@AlexPoole : 네,하지만 세 번째 쿼리에서 A. * 및 B. *가 사용됩니다. 나는 '*'를 피하고 명시 적으로 col 이름을 대신 지정하려고합니다. –