2015-06-10 2 views
0

Я искал и все, что я нашел, ссылается на дубликаты того же поля на записи. В базе данных, используемой для хранения компьютерного оборудования, и среди полей есть en0 и en1, которые содержат IP-адреса. Мне нужно найти записи с дублирующимися ips, которые существуют в любом поле. Для простоты здесь приведен пример таблицы:Запрос на поиск дубликатов в разных полях

id serial_no   en0   en1 
1 0000001 10.200.5.102 10.200.5.103 
2 0000002 10.200.6.102 10.200.6.103 
3 0000003 10.200.5.110 10.200.5.102 

Мне нужен запрос, возвращающий записи 1 и/или 3. Получение либо дубликат в порядке, лучше всего было бы вернуться обоих.

Благодаря

+0

_ "en0 и en1" _ - потому что, зачем нормализовать? В любом случае вы можете использовать самообучение. – CodeCaster

+0

Танк вам очень понравится. Таблица устарела, и нормализация не является вариантом. Я буду работать над самообучением. – wesmat

+0

_ «нормализация не вариант» _ - вы можете сделать это в представлении. – CodeCaster

ответ

1

Вы можете использовать следующий запрос:

SELECT DISTINCT id, serial_no, en0, en1 
FROM mytable 
INNER JOIN (SELECT ip 
      FROM (
       SELECT id, serial_no, en0 AS ip 
       FROM mytable 

       UNION 

       SELECT id, serial_no, en1 AS ip 
       FROM mytable) t 
      GROUP BY ip 
      HAVING COUNT(*) > 1) t 
ON t.ip = en0 OR t.ip = en1 

выше будет возвращать все записи, содержащие повторяющиеся IP-адреса.

Fiddle Demo here

Следующий подзапрос:

SELECT ip 
FROM (
    SELECT id, serial_no, en0 AS ip 
    FROM mytable 

    UNION 

    SELECT id, serial_no, en1 AS ip 
    FROM mytable) t 
GROUP BY ip 
HAVING COUNT(*) > 1; 

используется для возвращения повторяющихся IP-адресов. Обратите внимание на использование UNION вместо UNION ALL. Таким образом, IP-адрес, который повторяется в столбцах en0, en1 из , такой же номер не будет дублироваться. Перейдите на страницу UNION ALL, если вам нужно другое поведение.

+0

Спасибо за этот фантастический ответ и за включение скрипта sql - я не знал, что он существует. Я использовал различные скрипты кода, но не для sql! Я получаю «Код ошибки: 1242. Подзапрос возвращает более 1 строки», когда я запускаю на своем сервере, что составляет 5.6. Я преобразовал таблицы и имена полей в фактические данные для реальной БД, и, возможно, я испортил это. Я перепроверяю, а также создаю таблицу примеров, которую я использовал здесь. Надеюсь, я найду эту проблему. – wesmat

+0

Так что дублирование примера скрипта в БД отлично работало - я буду работать над тем, как обращаться к реальной БД. В очередной раз благодарим за помощь. – wesmat

+0

@wesmat Проблема с моим запросом. Предложение 'WHERE' должно обычно выглядеть как' en0 IN (... subquery здесь) ИЛИ 'en1 IN (... подзапрос повторяется здесь)'. Я попытался сделать это наоборот, чтобы сделать его более кратким, но он не работает, если подзапрос возвращает более одного значения. –

Смежные вопросы