SQL-запрос с условием WHERE, разрешающим использование пустых полей

#sql #sql-server

#sql #sql-сервер

Вопрос:

Извините, если название не очень понятно, честно говоря, я действительно не знаю, как объяснить это простыми словами. У меня следующая проблема.

У меня есть этот запрос:

 SELECT EQUIPO.EQUI_SERIE
FROM EQUIPO
     LEFT JOIN ASIGNACION ON EQUIPO.EQUI_SERIE = ASIGNACION.EQUI_SERIE
WHERE ASIG_ACTIVA = 'No'
ORDER BY EQUI_SERIE ASC;
  

Я хотел бы, чтобы он отображал все элементы из таблицы EQUIPO, на которые есть или не указаны ссылки в таблице ASIGNACION, и если на них есть ссылки, я хотел бы, чтобы он отображал только те, которые имеют значение ‘No’ в столбце ASIG_ACTIVA. Я пробовал разные вещи, но я не могу найти то, что мне нужно, в Интернете. Любая помощь была бы высоко оценена.

Ответ №1:

изменение условия соединения добавить ASIG_ACTIVA = 'No' к соединению

 SELECT EQUIPO.EQUI_SERIE
FROM EQUIPO
     LEFT JOIN ASIGNACION ON EQUIPO.EQUI_SERIE = ASIGNACION.EQUI_SERIE
 and ASIG_ACTIVA = 'No'

ORDER BY EQUI_SERIE ASC;
  

Ответ №2:

Предполагаю, что ASIG_ACTIVA это столбец в таблице, ASIGNACION не EQUIPO (вот почему псевдонимы важны). если это так, переместите WHERE в ON

 SELECT E.EQUI_SERIE
FROM EQUIPO E
     LEFT JOIN ASIGNACION A ON E.EQUI_SERIE = A.EQUI_SERIE
                           AND A.ASIG_ACTIVA = 'No'
ORDER BY E.EQUI_SERIE ASC;
  

Ответ №3:

Вы можете сделать это, ограничив объединяемую таблицу.

 SELECT EQUIPO.EQUI_SERIE
FROM EQUIPO
  LEFT JOIN ASIGNACION ON EQUIPO.EQUI_SERIE = ASIGNACION.EQUI_SERIE
                      AND ASIGNACION.ASIG_ACTIVA = 'No'
ORDER BY EQUI_SERIE ASC;
  

Добавляя AND в свое объединение, вы ограничиваете объединяемую таблицу ASIGNACION только строками, которые имеют no в столбце ASIGN_ACTIVE
Это позволит получить все строки в, ASIGNACION которые связаны и имеют no значение as.
Поскольку это левое соединение, вы также получаете NULL для каждой строки, которая либо не связана, либо имеет yes значение.

Ответ №4:

в дополнение к другим ответам я объясню вам, почему ваш запрос работает не так, как вы хотите, вы получили следующее:

 SELECT EQUIPO.EQUI_SERIE
FROM EQUIPO
     LEFT JOIN ASIGNACION ON EQUIPO.EQUI_SERIE = ASIGNACION.EQUI_SERIE
WHERE ASIGNACION.ASIG_ACTIVA = 'No'
ORDER BY EQUIPO.EQUI_SERIE ASC;
  

Проблема здесь в том, что предложение where фильтрует те значения, для которых значение ASIGNACION.ASIG_ACTIVA равно NULL (на основе ЛЕВОГО СОЕДИНЕНИЯ), и, как я понял, вам нужны записи со значением NULL или «No».
Таким образом, вы можете использовать решения, приведенные выше, или просто добавить к предложению where: «ИЛИ ASIGNACION.ASIG_ACTIVA РАВНО NULL», получая следующее:

 SELECT EQUIPO.EQUI_SERIE
FROM EQUIPO
     LEFT JOIN ASIGNACION ON EQUIPO.EQUI_SERIE = ASIGNACION.EQUI_SERIE
WHERE ASIGNACION.ASIG_ACTIVA = 'No' OR ASIGNACION.ASIG_ACTIVA IS NULL
ORDER BY EQUIPO.EQUI_SERIE ASC;