Фильтр не работает с двумя предложениями where
У меня есть запрос с двумя предложениями где. Пример кода:
SELECT CONCAT(E.Firstname, ' ',
E.Middlename, ' ',
E.Lastname, ' ',
E.Maidenname,
' (', E.Abbreviation, ')') AS Technician,
'White' AS Backcolor
FROM Employee AS E
WHERE E.Empkey NOT IN (
SELECT Empkey
FROM Taskassignation AS Ta
INNER JOIN Task AS T ON T.Taskassignationid = Ta.Taskassignationid
WHERE T.Taskstatusid != '09E02513-00AD-49E3-B442-A9ED2833FB25'
AND T.Taskstatusid != '60F68A00-A212-4B7A-B0A3-620B5887136C'
AND Empkey IS NOT NULL
AND Terminationdate IS NULL
GROUP BY Empkey
)
AND Departmentkey = 3
AND Terminationdate IS NULL
-- Now at the end of my second where I add two conditions:
WHERE T.Taskstatusid != '09E02513-00AD-49E3-B442-A9ED2833FB25'
AND T.Taskstatusid != '60F68A00-A212-4B7A-B0A3-620B5887136C'
AND Empkey IS NOT NULL
AND Terminationdate IS NULL
AND E.Title = 'Project Technician'
AND E.Title = 'Project Mgr';
По какой-то причине запросу не нужны мои последние условия, он просто получает все значения со всеми заголовками, а получает только заголовки, которые уже объявлены. Мне нужно указать, что фильтр отличается, если у меня есть два предложения where? Какие-либо предложения?
С уважением.
1 ответ
Давайте посмотрим только на ваши!= Сравнения. Внутренний выбор возвращает все записи, которые не равны '09E...' и не равны '60F...'
Затем вы запрашиваете все записи, которых нет в этом списке. Таким образом, каждая запись в этом результате должна иметь либо "09E...", либо "60F..."
Затем в конце вы добавляете предложение WHERE, которое исключает все записи, равные '09E...' и '60F...'. Это оставляет вас ни с чем.
Рассмотрим этот пример:
create table Emp ( ID varchar(30), Name varchar(30) )
insert into Emp ( ID, Name ) values
('314', 'Peter'),
('09E', 'Fred' ),
('ELD', 'Wally'),
('60F', 'Mary' ),
('AOK', 'Alice')
-- List rows other than IDs 09E and 60F
select * from Emp where ID != '09E' and ID !='60F'
-- Result is:
-- ID Name
-- 314 Peter
-- ELD Wally
-- AOK Alice
-- List rows that are NOT in the result set shown above
select * from Emp
where ID not in ( select ID from Emp where ID != '09E' and ID !='60F' )
-- Result is:
-- ID Name
-- 09E Fred
-- 60F Mary
-- List all the rows above, but exclude 09E and 60F
select * from Emp
where ID not in ( select ID from Emp where ID != '09E' and ID !='60F' )
and ID != '09E' and ID != '60F'
-- Result is empty
-- You've excluded all the records from the last results.
Также нужно быть осторожным, добавляя два члена вида X=A и X=B
create table Job ( Position varchar(30) )
insert into Job ( Position ) values
( 'CEO' ),
( 'Technician' ),
( 'Electrician' ),
( 'Manager' ),
( 'Secretary' )
select * from Job
where Position = 'Technician'
and Position = 'Manager'
-- Result set is empty
Вы можете подумать, что результат должен иметь две строки. Но рассмотрим второй ряд. Position = 'Technician' - это true, а Position = 'Manager' - false. Но вы запрашиваете только записи, где первое верно, а второе также верно.