2011-07-20 87 views
1

背景:我的僱主擁有一個由真正舊版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 

謝謝大家!

回答

0
CREATE TEMPORARY TABLE IF NOT EXISTS Inventory_Mac 
    SELECT Mac 
    FROM Inventory 

INSERT INTO Inventory_Mac 
    SELECT Mac2 
    FROM Inventory 

INSERT INTO Inventory_Mac 
    SELECT Mac3 
    FROM Inventory 

CREATE TEMPORARY TABLE IF NOT EXISTS Inventory_Duplicate_Mac 
    SELECT Mac, COUNT(*) AS cnt 
    FROM Inventory_Mac 
    GROUP BY Mac 
    HAVING COUNT(*) > 1 


SELECT DeviceName, Model, im.Mac, i.Mac, i.Mac2, i.Mac3 
FROM Inventory_Duplicate_Mac AS im 
    JOIN Inventory AS i 
    ON i.Mac = im.Mac 
     OR i.Mac2 = im.Mac 
     OR i.Mac3 = im.Mac 
ORDER BY im.Mac 
+0

的MySQL 3.23不支持工會:(但非常感謝你的時間! – Roger

+0

沒有UNIONs?編輯 –

+0

@Roger:一些檢查'WHERE Mac IS NOT NULL'可以被添加到前3個查詢中,以降低臨時表中的行數(但我認爲這不會影響結果) –

1

想到的一個'簡單'解決方案是創建第二個臨時表,列出一列中的所有MAC地址,因此您需要爲第一個臨時表中的一個條目創建三個條目。這個答案

0

不是100%肯定,但它可能是值得使用LEFT一試JOINS例如:

SELECT address1 
FROM addresses 
LEFT JOIN Inventory_Duplicate_Addresses ad1 
ON Addresses.MAC = ad1.mac 
LEFT JOIN Inventory_Duplicate_Addresses ad2 
ON Addresses.MAC = ad2.mac2 
LEFT JOIN Inventory_Duplicate_Addresses ad3 
ON Addresses.MAC = ad3.mac3