Фильтр не работает с двумя предложениями 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. Но вы запрашиваете только записи, где первое верно, а второе также верно.

Другие вопросы по тегам