Предыстория: у моего работодателя есть база данных, основанная на действительно старой версии MySQL (3.23). Меня попросили найти дубликаты серийных номеров и MAC-адресов в базе данных.
Мне удалось найти повторяющиеся серийные номера, но, поскольку эта версия MySQL не поддерживает подзапросы, мне пришлось прибегнуть к использованию временной таблицы. Вот два оператора SQL, которые я использовал в итоге:
CREATE TEMPORARY TABLE IF NOT EXISTS Inventory_Duplicate_Serials
SELECT Serial
FROM Inventory
WHERE Serial IS NOT NULL
GROUP BY Serial
HAVING COUNT(Serial) > 1
SELECT DeviceName, Model, Inventory.Serial
FROM Inventory
INNER JOIN Inventory_Duplicate_Serials
ON Inventory.Serial = Inventory_Duplicate_Serials.Serial
ORDER BY Serial
Теперь мне нужно найти дубликаты MAC-адресов. Проблема в том, что в таблице «Инвентаризация» есть три поля MAC-адреса (MAC, MAC2 и MAC3). Так, например, если значение поля «MAC» элемента совпадает со значением поля «MAC2» другого элемента, мне нужно знать об этом. Как мне это сделать? Спасибо за ваше время.
ОБНОВЛЕНИЕ: Решено. В итоге я создал две временные таблицы (Inventory_All_MACs и Inventory_Duplicate_MACs). Это пять запросов:
CREATE TEMPORARY TABLE IF NOT EXISTS Inventory_All_MACs
SELECT MAC
FROM Inventory
WHERE MAC != ''
CREATE TEMPORARY TABLE IF NOT EXISTS Inventory_All_MACs
SELECT MAC2 AS MAC
FROM Inventory
WHERE MAC2 != ''
CREATE TEMPORARY TABLE IF NOT EXISTS Inventory_All_MACs
SELECT MAC3 AS MAC
FROM Inventory
WHERE MAC3 != ''
CREATE TEMPORARY TABLE IF NOT EXISTS Inventory_Duplicate_MACs
SELECT MAC
FROM Inventory_All_MACs
GROUP BY MAC
HAVING COUNT(MAC) > 1
SELECT DeviceName, Model, Inventory_Duplicate_MACs.MAC AS DuplicateMAC, Inventory.MAC, MAC2, MAC3
FROM Inventory_Duplicate_MACs
INNER JOIN Inventory
ON Inventory.MAC = Inventory_Duplicate_MACs.MAC
OR Inventory.MAC2 = Inventory_Duplicate_MACs.MAC
OR Inventory.MAC3 = Inventory_Duplicate_MACs.MAC
ORDER BY Inventory_Duplicate_MACs.MAC, DeviceName, Model
Спасибо всем!