背景:我的僱主擁有一個由真正舊版MySQL(3.23)支持的數據庫。我被要求在數據庫中找到重複的序列號和MAC地址。MySQL:在多個字段中查找重複記錄
我能夠找到重複的序列號,但由於此版本的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」字段的值相同,我需要知道它。我如何去做這件事?感謝您的時間。
UPDATE:解決。我最終創建了兩個臨時表(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
謝謝大家!
的MySQL 3.23不支持工會:(但非常感謝你的時間! – Roger
沒有UNIONs?編輯 –
@Roger:一些檢查'WHERE Mac IS NOT NULL'可以被添加到前3個查詢中,以降低臨時表中的行數(但我認爲這不會影響結果) –