#sql
#sql
Вопрос:
Привет, у меня есть следующие две таблицы:
Таблица DEP:
Deptarment_id Dep_name
--------------------
1 Marketing
2 IT
3 Accouting
4 QA
null Contract
5 BI
Таблица EMP:
Deptarment_id Dep_name
--------------------
1 Marketing
2 IT
3 Accounting
4 QA
null Contract
5 BI
Если я выполню следующий запрос,
SELECT * FROM CUS left join EMP on Deptarment_id = CUSTOMER_ID;
Я получу
CUSTOMER_ID NAME Deptarment_id Dep_name
1 JOE 1 Marketing
3 Chris 3 Accounting
5 John 5 BI
null Steve null null
null Mary null null
99 test null null
Но я ищу что-то подобное. Я не могу вернуть значение ‘Contract’.
CUSTOMER_ID NAME Deptarment_id Dep_name
1 JOE 1 Marketing
3 Chris 3 Accounting
5 John 5 BI
null Steve null Contract
null Mary null Contract
99 test null null
Комментарии:
1. Пометьте свой вопрос базой данных, которую вы используете.
2. кажется, вы пропустили таблицу … потому
Ответ №1:
То, что вы хотите сделать, на самом деле «неправильно использует» NULL
значение в SQL. NULL
не является конкретным значением; семантически это означает, что значение неизвестно (не отсутствует, но неизвестно). Следовательно, равенство не имеет смысла.
Теория хороша, но иногда мы хотим рассматривать NULL
как законное значение. В этом случае будьте явными:
SELECT *
FROM DEP left join
EMP
on (DEP.Department_id = EMP.Department_id) or
(DEP.Department_id is null AND EMP.Department_id is null);
Я должен предупредить вас, что or
в join
состоянии часто является убийцей производительности. Некоторые базы данных предлагают NULL
безопасные сравнения, но это зависит от конкретной базы данных. Существуют и другие методы, если производительность является проблемой.
Если производительность является проблемой, пожалуйста, задайте другой вопрос и включите:
- Жизнеспособный образец данных
- Запрос, который вы пытались
- Результаты, которые вы хотите
- Соображения по производительности (насколько велики таблицы)
В этом вопросе данные выборки не соответствуют запросу, поэтому я заполнил некоторые детали.
Комментарии:
1. Большое вам спасибо.