KSQL: Left Join with Not Equal, где условие не удовлетворяет результату

Найдите проблему ниже и подтвердите ее.

Шаг 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

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

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 where, соответствующий запрос не дал правильного результата. 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';

person Karthikeyan Rasipalay Durairaj    schedule 22.09.2018    source источник
comment
Возможный дубликат левого соединения не возвращает все строки   -  person philipxy    schedule 23.09.2018
comment
Привет. Узнайте, что возвращает LEFT JOIN: строки INNER JOIN плюс несопоставленные строки левой таблицы, расширенные на NULL. Всегда знайте, какое ВНУТРЕННЕЕ СОЕДИНЕНИЕ вы хотите как часть ЛЕВОГО СОЕДИНЕНИЯ. WHERE или ON, требующие, чтобы правый столбец таблицы не был NULL после LEFT JOIN ON, удаляет все строки, расширенные NULL, т.е. оставляет только строки INNER JOIN, т.е. превращает LEFT JOIN во INNER JOIN. Это у тебя есть.   -  person philipxy    schedule 23.09.2018
comment
Это часто задаваемые вопросы. Пожалуйста, всегда гуглите много ясных, кратких и конкретных версий / формулировок вашего вопроса / проблемы / цели с вашими конкретными строками / именами и без них и читайте много ответов. Добавьте в поисковые запросы релевантные ключевые слова, которые вы обнаружите. Если вы не нашли ответа, отправьте сообщение, используя поиск по одному из вариантов по заголовку и ключевым словам для тегов. См. Текст при наведении курсора мыши на стрелку "против". Если у вас есть вопрос о не повторяющемся коде, который нужно опубликовать, прочтите и действуйте в соответствии с минимальным воспроизводимым примером.   -  person philipxy    schedule 23.09.2018
comment
В чем именно заключается ваш вопрос? Кроме того, вы не просто использовали! = Вместо =, вы изменили ON на WHERE. PS Пожалуйста, прочтите справку по редактированию о формате блока кода и отформатируйте свой код в удобном для чтения виде.   -  person philipxy    schedule 23.09.2018


Ответы (2)


То, что вы описали до сих пор, не противоречит тому, как ведет себя 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, вы не получите совпадения.

person Robin Moffatt    schedule 24.09.2018
comment
Спасибо, Робин. Ты прав . Я проверил в СУБД и увидел такое же поведение. - person Karthikeyan Rasipalay Durairaj; 24.09.2018
comment
Отлично - вежливо отмечать мой ответ как правильный (если это так) или, по крайней мере, проголосовать за него. - person Robin Moffatt; 25.09.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 ПРОДАЖ ЧИКАГО

Левое соединение без какого-либо условия where:

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 ПРОДАЖ

person Karthikeyan Rasipalay Durairaj    schedule 24.09.2018