KSQL: левое соединение с неравным, если условие не удовлетворяет результату - PullRequest
0 голосов
/ 22 сентября 2018

Пожалуйста, найдите нижеприведенную проблему и подтвердите ее.

Шаг-01: На основе условия соединения, получение значения из таблицы и заполнения.Поскольку в таблице B нет совпадающих значений, все столбцы заполняются значением NULL.

Столбец: B.OP_TYPE, B.DEMO_ID

ksql> SELECT PLAN_ID,A_OP_TYPE,B.OP_TYPE,A.PRIMARY_DEMO_ID,B.DEMO_ID \
FROM TBL_PLN_PRO_DIV_SDIV A \
LEFT JOIN  TBL_MS_TARGET_GROUP11 B \
ON (A.PRIMARY_DEMO_ID=B.DEMO_ID);
382591 | U | null | 3085 | null

Тот же запрос выбора, где условие дает тот же результат, что и ожидалось.

ksql> SELECT PLAN_ID,A_OP_TYPE,B.OP_TYPE,A.PRIMARY_DEMO_ID,B.DEMO_ID \
FROM TBL_PLN_PRO_DIV_SDIV A \
LEFT JOIN  TBL_MS_TARGET_GROUP11 B \
ON (A.PRIMARY_DEMO_ID=B.DEMO_ID) WHERE B.OP_TYPE IS NULL;
382591 | U | null | 3085 | null

Но когда мы попытались выбрать с помощью Not Equal, где условие, соответствующий запрос не дает должного результата.B.OP_TYPE! = 'D' - Здесь условие, включающее B.OP_TYPE, равно нулю

ksql> SELECT PLAN_ID,A_OP_TYPE,B.OP_TYPE,A.PRIMARY_DEMO_ID,B.DEMO_ID \
FROM TBL_PLN_PRO_DIV_SDIV A \
LEFT JOIN  TBL_MS_TARGET_GROUP11 B \
ON (A.PRIMARY_DEMO_ID=B.DEMO_ID) WHERE B.OP_TYPE != 'D';

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Таблица сотрудников:

выберите empno, ename, job, deptno из emp1;

7839 KING PRESIDENT 10 7698 BLAKE MANAGER 30 7902 FORD ANALYST 20 7369 SMITH CLERK 20

выберите * из dept1;

10 УЧЕТ НЬЮ-ЙОРКА 30 ПРОДАЖ ЧИКАГО

Соединение влево без каких-либо условий:

select empno,ename,job,a.deptno,a.DEPTNO,DNAME from emp1 a left join dept1 b on (a.DEPTNO = b.DEPTNO)

7839    KING    PRESIDENT   10  10  ACCOUNTING
7698    BLAKE   MANAGER     30  30  SALES
7369    SMITH   CLERK       20  20  
7902    FORD    ANALYST     20  20  

where condition with Null value 

select empno,ename,job,a.deptno,a.DEPTNO,DNAME from emp1 a left join dept1 b on (a.DEPTNO = b.DEPTNO) where DNAME is null;

7369    SMITH   CLERK   20  20  
7902    FORD    ANALYST 20  20  

select empno,ename,job,a.deptno,a.DEPTNO,DNAME from emp1 a left join dept1 b on (a.DEPTNO = b.DEPTNO) where DNAME != 'ACCOUNTING';

7698 BLAKE MANAGER 30 30 ПРОДАЖ

0 голосов
/ 24 сентября 2018

То, что вы описали до сих пор, не противоречит поведению SQL.Важно то, что NULL означает отсутствие значения.Так что FOO != 'B' не не совпадает, где FOO равно NULL.

Вы не предоставили образцы данных для TBL_PLN_PRO_DIV_SDIV и TBL_MS_TARGET_GROUP11, поэтому здесь сложно определенно помочь.

Если ваш запрос не возвращает строки, где A_OP_TYPE != 'D', тогда я бы согласился, что что-то не так, потому что вы показали, что есть строки, где A_OP_TYPE='U' (то есть != 'D').Но если у вас нет соответствующих записей из TBL_MS_TARGET_GROUP11, в которых OP_TYPE имеет значение, отличное от D, совпадение не будет.

...