오라클의 왼쪽 조인 및 where 절 오류


10
CREATE TABLE "ATABLE1"
  (
    "COLUMN1" VARCHAR2(20 BYTE),
    "COLUMN2" VARCHAR2(20 BYTE)
  );

CREATE TABLE "ATABLE2"
  (
    "COLUMN1" VARCHAR2(20 BYTE),
    "COLUMN2" VARCHAR2(20 BYTE)
  );

Insert into ATABLE1 (COLUMN1,COLUMN2) values ('A','1');
Insert into ATABLE1 (COLUMN1,COLUMN2) values ('B','2');

Insert into ATABLE2 (COLUMN1,COLUMN2) values ('A',null);
Insert into ATABLE2 (COLUMN1,COLUMN2) values ('A','1');
Insert into ATABLE2 (COLUMN1,COLUMN2) values ('A','2');

select ATABLE1.column1, count(ATABLE2.column1) 
    from ATABLE1 Left OUTER JOIN ATABLE2 on ATABLE1.column1 = atable2.column1
    GROUP BY ATABLE1.column1;

Result

COLUMN1              COUNT(ATABLE2.COLUMN1) 
-------------------- ---------------------- 
A                    3                      
B                    0    

이것은 예상대로 작동합니다. 문제는 항상 ATABLE1의 모든 행을 표시하고 제한을 적용한다는 것입니다.

select ATABLE1.column1, count(ATABLE2.column1) 
    from ATABLE1 Left OUTER JOIN ATABLE2 on ATABLE1.column1 = atable2.column1
    where atable2.column2 = '1'
    GROUP BY ATABLE1.column1;


COLUMN1              COUNT(ATABLE2.COLUMN1) 
-------------------- ---------------------- 
A                    1                      

왼쪽 조인으로도 ATABLE1의 모든 열이 표시되지 않는 이유는 무엇입니까? 그것들을 어떻게 보이게 할 수 있습니까?

많은 감사드립니다.


당신이 테스트 오브젝트를 설정에 넣어 가지고 특히 노력을 위해 +1,
잭 topanswers.xyz 시도라고

" 왼쪽 조인으로도 ATABLE1의 모든 열 이 표시되지 않는 이유는 무엇 입니까?" - '모든 행'을 말하는 것을 의미 했습니까?
잭 topanswers.xyz 시도라고

@JackDouglas 네, 더 이해가 될 것입니다.
Aaron

답변:


7

선택적 / 외부 테이블에 WHERE 필터를 추가하면 조회를 INNER JOIN으로 변경합니다. 조인 또는 파생 테이블 또는 CTE에 조건을 추가해야합니다.

select ATABLE1.column1, count(ATABLE2.column1) 
    from ATABLE1 Left OUTER JOIN ATABLE2
         on ATABLE1.column1 = atable2.column1 AND atable2.column2 = '1'
    GROUP BY ATABLE1.column1;

3

왼쪽 조인으로도 ATABLE1의 모든 열이 표시되지 않는 이유는 무엇입니까? 그것들을 어떻게 보이게 할 수 있습니까?

ATABLE.column1 만 가져 오도록 쿼리에 지시하고 있기 때문입니다. gbn 또는 Jack의 쿼리를받는 경우 SELECT 절에 ATABLE1. * (또는 구체적으로 각 이름을 지정)을 표시하십시오.

select ATABLE1.*, count(ATABLE2.column1) 
from ATABLE1 Left OUTER JOIN ATABLE2
     on ATABLE1.column1 = atable2.column1 AND atable2.column2 = '1'
GROUP BY ATABLE1.column1;

1
흥미롭게도 OP가 모든 열을 나열하는 방법에 대해 혼동하지 않기를 바랍니다. 반면에 그것은 그들이 요구 한 것입니다. +1.
레이 리펠

2

결합에 조건추가 하는 대안 null은 필터에서 테스트하는 것 입니다.

select ATABLE1.column1, count(ATABLE2.column1) 
    from ATABLE1 Left OUTER JOIN ATABLE2 on ATABLE1.column1 = atable2.column1
    where atable2.column2 is null or atable2.column2 = '1'
    GROUP BY ATABLE1.column1;

나는이 변형을 선호하지만 덜 읽기 쉬운 것으로 간주 할 수 있습니다.

select ATABLE1.column1, count(ATABLE2.column1) 
    from ATABLE1 Left OUTER JOIN ATABLE2 on ATABLE1.column1 = atable2.column1
    where decode(atable2.column2,'1',1,null,1,0)=1
    GROUP BY ATABLE1.column1;

이 작업을 수행하는 유일한 이유는 어떤 이유로 필터에 조건을 넣을 수없는 경우입니다 (때로는 더 복잡한 쿼리의 경우).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.