2013-09-11 4 views
0

Упрощение вопрос:Mysql не в заявлении не работает

Если у меня есть следующие (где CN = имя, UID = эми ID, и супервизор = ЕМР ID супервизора.).:

CN   UID  supervisor 
Jerry  4   NULL 
Dave  11  15  
Dan   12  16  
Jack  13  17  
Jason  14  11  
Tom   10  15  
Berry  16  12 

Я ожидаю, что ни Дэйв, ни Дэн не будут включены в список, потому что они тоже супервайзеры (2 или больше).

SELECT 
reports_accreditallfr.cn, 
reports_accreditallfr.uid, 
reports_accreditallfr.supervisor 
FROM 
reports_accreditallfr 
WHERE 
reports_accreditallfr.uid NOT IN (reports_accreditallfr.supervisor) 

Мое текущее заявление дает все. Я предполагаю, что инструкция NOT IN работает только по строкам и не сканирует весь столбец супервизора.

ответ

1

Вам нужен подзапрос.

SELECT reports_accreditallfr.cn, reports_accreditallfr.uid, 
     reports_accreditallfr.supervisor 
FROM reports_accreditallfr 
WHERE reports_accreditallfr.uid NOT IN (select reports_accreditallfr.supervisor 
             from reports_accreditallfr 
             where reports_accreditallfr.supervisor is not null 
             ); 

Ваше выражение эквивалентно:

reports_accreditallfr.uid <> reports_accreditallfr.supervisor 

Это, по-видимому истинна на всех рядах.

+0

избили меня на секунду. Скажите мне, когда вы выйдете из системы, я вернусь назад эн. : P – Lobo

+0

Это работает, если я использую инструкцию IN, но не NOT IN. NOT IN не дает мне ничего, когда он должен производить около 80% моей оригинальной таблицы. – blankip

+0

@blankip. , , Предположительно, это потому, что поле 'supervisor' имеет значения« NULL », что приводит к ошибке« NOT IN ». Образцы данных в вопросе не имеют значений «NULL», поэтому я не включил проверку. –

0

Попробуйте использовать SELECT заявление для NOT IN

SELECT 
    reports_accreditallfr.cn, 
    reports_accreditallfr.uid, 
    reports_accreditallfr.supervisor 
FROM 
    reports_accreditallfr 
WHERE 
    reports_accreditallfr.uid NOT IN (SELECT reports_accreditallfr.supervisor FROM reports_accreditallfr) 

Вы могли бы также упростить заявление следующее:

SELECT 
    cn, 
    uid, 
    supervisor 
FROM 
    reports_accreditallfr 
WHERE 
    uid NOT IN (SELECT supervisor FROM reports_accreditallfr) 
1

Если вы хотите, чтобы пропустить строки, которые имеют значение в uid колонке который появляется в столбце supervisor (по меньшей мере, для одной строки в таблице), и если uid гарантированно будет уникальным,

Yyou можно получить, что с использованием «анти-присоединиться к» схеме:

SELECT r.cn 
    , r.uid 
    , r.supervisor 
    FROM reports_accreditallfr r 
    LEFT 
    JOIN reports_accreditallfr s 
    ON s.supervisor = r.uid 
WHERE s.supervisor IS NULL 

ВНИМАНИЕ: LEFT JOIN операция возвращает все строки из r, положение WHERE опускает любую строку, которая имела по меньшей мере один соответствующий ряд из s вернулся ,

Небольшое отличие этого запроса от запроса в выбранном ответе. Этот запрос будет возвращать строки, которые имеют значение NULL в uid, в то время как запрос в выбранном ответе опустит те (поскольку предикат NULL NOT IN (foo) не возвращает «истины».

запроса в выбранном ответе может быть изменен, чтобы включить OR uid IS NULL предикат сравнит запрос, --или-- этот запрос может быть изменен, чтобы включить AND r.uid IS NOT NULL предикат, чтобы сделать матч Resultset

(у нас нет никаких примеров строк, которые имеют значение NULL для. uid, а просто что-то, о чем нужно знать в более общем случае.)

Смежные вопросы