2016-06-24 2 views
0

Я имею дело с ситуацией на работе, где кто-то настраивал некоторые таблицы без первичного ключа (arghhh). теперь я пытаюсь сравнить данные dev с данными prod, и самое лучшее, что я могу сказать, - это небольшое различие в количестве строк.mysql - обнаружение идентичных строк, когда нет первичного ключа

Я решил, что лучший способ сравнить данные - сделать объединение в каждом столбце, но я получаю неожиданные результаты.

, чтобы проверить это, я только что присоединился к той же самой таблице. Эта таблица имеет 1309 строк. Но когда я присоединяюсь к каждому столбцу, я получаю 1014. Это меньше строк. Если бы я ожидал получить больше. Что дает?

select * 
from `default_tire_classifications` tc1 
join `default_tire_classifications` tc2 
on tc1.`marketing_tread_name` = tc2.`marketing_tread_name` 
AND tc1.`size` = tc2.`size` 
AND tc1.product_category = tc2.product_category 
AND tc1.application = tc2.application 
AND tc1.vehicle_type = tc2.vehicle_type 
AND tc1.oem_part = tc2.oem_part 
AND tc1.position = tc2.position 
AND tc1.size = tc2.size 
AND tc1.sect_wdth = tc2.sect_wdth 
AND tc1.aspect_ratio = tc2.aspect_ratio 
AND tc1.rim_size = tc2.rim_size 
AND tc1.speed_rating = tc2.speed_rating 
AND tc1.load_index = tc2.load_index 

ответ

2

Я подозреваю, что некоторые из столбцов содержат значения NULL. Сравнение равенства с NULL-значением дает NULL. (SQL три многозначных булевой логики.)

Для сравнения, который дает TRUE, когда обе стороны являются NULL, вы могли бы сделать что-то вроде этого

(tc1.col = tc2.col OR (tc1.col IS NULL AND tc2.col IS NULL)) 

MySQL также нестандартное «нуль-сейф «оператор сравнения равенства <=> (космический корабль), который делает то же самое.

tc1.col <=> tc2.col 

возвращает TRUE или FALSE и возвращает TRUE, если значения с обеих сторон равны NULL.

Таким образом, заменив оператор = (сравнение равенства) с <=> оператор должен решить проблему с сравнением NULL значения.

(Это не означает, что NULL значения является проблемой, или является только проблема.)

+0

спасибо за подробный ответ. никогда не знал этого! – hamobi

1

Если ваши поля содержат NULL, вы потеряете их. Потому что NULL = NULL не соответствует действительности.

+0

Чтобы быть более точным, 'NULL = NULL' возвратит NULL (не FALSE). – spencer7593