2011-11-02 6 views
1

일부 사용자가 만든 SQL을 실행하고 결과를 표시해야합니다. 예를 들어 SQL이 될 수 : 그대로열은 rownum을 사용하여 하위 쿼리에서 모호하게 정의되었습니다.

SELECT t1.*, t2.* FROM table1 t1, table2 t2, where table1.id = table2.id 

이 SQL은 잘 작동하지만 내가 수동으로 페이지 매김을 추가하고 ROWNUM을 표시해야하므로 SQL은 다음과 같이 끝납니다. 표 1 및 표 2 모두 동일한 이름 ("ID")와 필드를 포함하기 때문에 "열 애매하게 정의 ORA-00918"

SELECT z.* 
FROM(  
    SELECT y.*, ROWNUM rn 
    FROM (     
     SELECT t1.*, t2.* FROM table1 t1, table2 t2, where table1.id = table2.id 
    ) y  
    WHERE ROWNUM <= 50) z   
WHERE rn > 0 

이 예외가 발생.

이 문제를 방지하는 가장 좋은 방법은 무엇입니까?

감사합니다.

  • 결국

UPDATE, 우리는 추한 방법을 가서 그것들을 실행하기 전에 들어오는 각각의 SQL 구문을 분석했다. 기본적으로 별표를 사용하여 추가해야 할 필드를 확인하고 모든 필드를 고유 ID로 별칭을 지정했습니다. 이로 인해 성능 저하가 초래되었지만 고객이 요구 사항을 충족하는 유일한 옵션이라는 것을 고객이 이해했습니다.

나는 Lex 답을 우리가 작업을 끝내는 해결책으로 표시 할 것이다.

+0

가능 중복 [ORA-00918 : 모호 SELECT \ *에 정의 된 항목 (http://stackoverflow.com/questions/6233086/ora-00918-column-ambiguously-defined-in-select) – Ben

+0

@Ben 불행히도, 특별한 요구 사항이 없었기 때문에 나는 그 대답을 그 당시에는 바람직하지 않게 만들었 기 때문에. – Damntry

답변

3

적어도 하나의 table1.id와 table2.id에 대해 별칭을 지정해야한다고 생각합니다. 그리고 다른 해당 열 이름도 가능합니다.

그래서 대신 SELECT t1.*, t2.* FROM table1 t1, table2 사용 일이 같은 :

SELECT t1.id t1id, t2.id t2id [rest of columns] FROM table1 t1, table2 t2 

나는 오라클 구문에 익숙하지 않은,하지만 난 당신이 아이디어를 얻을 것 같아요.

+0

렉스 덕분에 해결할 수는 있지만 제 경우에는 적용 할 수 없습니다. 나는 방금 SQL을 받았기 때문에 구문 분석해야하지만 * 쿼리 필드를 가져 와서 각각의 별칭을 지정하는 것은 너무 어렵습니다. 그리고 SQL은 사용자에게 잘 작동하기 때문에 SQL을 고칠 수는 없습니다. – Damntry

+0

그런 경우 어쩌면 y. *를 사용하지 않고 t1과 t2에서 필요한 열 이름을 지정할 수 있습니다. 어쩌면 둘 중 하나의 ID 열을 지정하지 않으면 작동할까요? (id 컬럼이 필요 없다는 전제하에) –

+0

사용자가 필드를 선택하는 것이므로 모든 컬럼을 표시해야합니다. – Damntry

2

나는 비슷한 것에 대한 대답을 찾고있었습니다. 몇 가지 NULL 열이있는 별칭이 지정된 하위 쿼리를 참조했습니다. 하나 이상의 컬럼을 가지고 있기 때문에 NULL 컬럼에 별명을 붙여야했습니다.

는를 선택한다. * t2.column가 t2.column가 t2.column (T1 에서 t1.column, NULL, NULL, t1.column를 선택 t1.column 여기서 T1 = 'VALUE')가 t2.column = t1.column의 왼쪽 외부 조인 t2;

하위 쿼리의 NULL 열에 별칭을 지정하면 정상적으로 작동합니다.

1

당신이 구문 쿼리를 수정 (또는 사용자가 그렇게 할 수)에 USING 절을 명시 적으로 JOIN 구문을 사용할 수 있다면,이 자동 손에서 문제를 해결하는 것 :

SELECT t1.*, t2.* 
FROM table1 t1 
JOIN table2 t2 USING (id) 

USING 절은 하나의 id 열만 결과에 남아 있으므로 문제가 없어지는 것을 제외하고 ON t1.id = t2.id (또는 질문에 암시적인 JOIN)과 동일합니다.

USING 절에 포함되지 않은 동일한 이름을 가진 열이 더 있으면 문제가 계속 발생합니다. @Lex에 의해 기술 된 것과 같은 별칭은 그때 반드시 필요합니다.

+0

사실, 문제는 우리가 기존의 모든 SQL과 역 호환이 필요하다는 것입니다. 그리고 회사는 이전에 작업 한 이후로 변경하지 않을 것이라고 이미 말했습니다. 이 문제는 데스크톱 클라이언트에서 전체 웹 응용 프로그램으로 이전 중이기 때문에 도입되었습니다. 이전에 사용 된 이전의 일반 그리드 컨트롤과 비교할 때 구성 요소가 훨씬 비중 있기 때문에 페이지 매김이 필요했습니다. – Damntry

0

null 값 바꾸기 기능을 사용하여이 문제를 해결하십시오.

SELECT z.* 
FROM(  
    SELECT y.*, ROWNUM rn 
    FROM (     
     SELECT t1.*, t2.* FROM table1 t1, table2 t2, where 

     NVL(table1.id,0) = NVL(table2.id,0) 

    ) y  
    WHERE ROWNUM <= 50) z   
WHERE rn > 0 
+0

고마워요 @ peenritwanz,하지만 거기에 null ID를 열 없습니다. 중복 된 이름으로 검색된 열로 인해 오류가 발생했습니다. 이 문제가 해결되지 않습니다. – Damntry