2017-11-02 11 views
0

자체 조인과 교차 조인 할 때 교차 조인에서 특정 열을 참조하는 방법을 알아 내려고합니다. 십자가 조인 테이블 전체에 별칭도 주어 지므로 다른 하위 쿼리와 자연스럽게 조인되기 때문에 열 이름에 액세스하는 데 문제가 있습니다.SQL/PSQL 같은 테이블을 서로 조인 한 후 where 절에서 열 이름을 참조하는 중

select q0.sid, q0.sname 
from (buys t1 cross join student s3 cross join student s4) q0 natural join 
    (select s5.sid, s5.sname, s6.sid, s6.sname, t3.sid, t3.bookno                  
     from buys t2 cross join student s5 cross join student s6 cross join buys t3                  
     where t2.sid = s5.sid and t3.bookno = t2.bookno) q1 
where t1.sid = s3.sid; 

문제는 그 q0.sid이 모호하기 때문에 t1.sid 및 s3.sid을 비교하기 위해 노력 ''절 : 여기에 코드입니다. 교차 결합에서 해당 열에 어떻게 액세스합니까?

+0

열 [별칭] (https://www.tutorialspoint.com/postgresql/postgresql_alias_syntax.htm)을 사용하십시오 (예 : SELECT s5.sid AS s5_sid, s6.sid AS s6_sid'). – Serge

+0

여기는 문제가 아닙니다. 나는 첫 번째 교차점 내부에서 t1.sid와 s3.sid에 접근 할 수 없다. 끝 부분에서 클래스가있는 곳을 위해 –

+0

'(t1 교차 결합 학생 s3 교차 결합 학생 s4 구매)'을 리팩토링해야한다. 어때요? (SELECT t1.sid AS t1_sid, s3.sid AS s3_sid, s4.sid AS s4_sid FROM 구입 t1 CROSS JOIN 학생 s3 CROSS JOIN 학생 s4'을 구입 하시겠습니까? – Serge

답변

0

저는 교수님 덕분에 답을 발견했습니다. With 문을 사용하여 모든 열 이름의 잔인한 이름을 바꾸어야합니다. 따라서 다음 줄을 따라갈 수 있습니다 :

with e1 as (select t1.sid as t1sid, t1.bookno as t1bookno, 
        s1.sid as s1sid, s1.sname as s1sname, 
        s2.sid as s2sid, s2.sname as s2sname 
      from buys t1 cross join student s1 cross join student s2), 
    e2 as (select t1.sid as t1.sid, etc as etc) 

필요한 모든 열의 이름을 바꾸는 것은 잔인한 방법 일 뿐이지 만 작동합니다. 죄송합니다. 내가하려는 것은 SQL의 관계형 대수로 직접 변환하는 것입니다. 도움을 주신 분께 감사드립니다.

0

NATURAL join은 거의 유용하지 않고 매우 까다로운 표준 SQL의 기이입니다. 나는 그것을 전혀 사용하지 않을 것이다.

USING 조인 조건의 절이 거의 같고 오류가 발생하지 않습니다 (기본 테이블의 열이 변경되거나 쿼리 목록이 FROM 인 경우). 일부 SQL 전문가는 USING 절을 더 명시적인 ON 절보다 쉽게 ​​분리하기 때문에 절을조차 꺼립니다. 나는 그들과 함께하지 않는다. 뿐만 아니라 모호한 열 이름에서 모든을 참조하는 모든 시도 - 특정 쿼리에

은 파생 테이블 q0q1NATURAL 불가능 조인을 사용하게하는, 중복 된 열 이름이 있습니다. 여기에는 바깥 쪽 SELECT 목록의 모호한 참조 q0.sid, q0.sname이 포함됩니다 (student 테이블은 q0에 두 번 포함됩니다). 또한 하위 쿼리 q1에있는 SELECT 목록은 용도가 없으며 열은 어디에도 사용되지 않습니다.

검색어가 여러 곳에서 잘못 작성되어 다시 작성했습니다. 질문은 쿼리가 수행해야하는 것에 대한 설명, 정확한 테이블 정의 및 Postgres 버전으로 시작해야합니다.