#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;