2013-11-25 3 views
1

у меня есть две таблицы с разницей около 3000 записейComparion запрос в MySQL не возвращающие правильные результаты

select count(name) from t1 

возвращает 1847073

select count(name) from t2 

возвращает 1813492

но когда Я пытаюсь получить результаты, которые находятся в одном, которые не находятся в другом, я просто получаю нулевые результаты.

select t1.name from t1 where t1.name not in (select t2.name from t2); 

Я также попробовал левое соединение с таблицей с большим количеством записей на левой, и он просто работает навсегда

select t1.name from t1 left join t2 on t1.name = t2.name where t2.name is null 

ответ

2

Ваш стол t1 может иметь некоторые дублированные имена, так что это прекрасно, что оно имеет больше записей, чем таблица t2, но все же все имена в t1 также присутствуют в t2.

Но вы должны также учитывать тот факт, что некоторые имена могут быть в таблице t1 NULL, и так как NULL NOT IN (....) будет оцениваться как NULL, то они не будут показаны, если не добавить явное условие:

OR t1.name IS NULL; 

но для соответствия стандарту SQL IN/NOT IN возвращает NULL не только в том случае, если выражение в левой части равно NULL, но также, если в списке не найдено совпадений, а одно из выражений в списке - NULL, а также необходимо исключить имена NULL из подзапроса NOT IN:

SELECT t1.name 
FROM t1 
WHERE 
    t1.name NOT IN (SELECT t2.name FROM t2 WHERE t2.name IS NOT NULL) 
    OR t1.name IS NULL; 

Ваш второй запрос выглядит хорошо, но вы, вероятно, пропустите индекс в столбце имени на обеих таблицах.

+0

нормально, кажется, Thats на правильном пути, после того, как я добавил, что является недействительным он дал 296 записи, содержащие пустое значение для имени, но есть и другие данные .. Что, по вашему мнению, является вопрос с остальной частью 2000 что-то ? дубликатов этих 296 нулевых записей? –

+0

@EduardoDennis вы правы, это не только значения NULL в t1, но и подзапрос не должен возвращать нулевые значения, см. Мой обновленный ответ – fthiella

0

Это работает?

SELECT   t1.name 
FROM    table1 t1 
NATURAL LEFT JOIN table2 t2 
WHERE    t2.name IS NULL 
Смежные вопросы