Найти повторяющиеся строки в базе данных - PullRequest
4 голосов
/ 23 сентября 2010

Как найти повторяющиеся строки? Если last_name является повторяющимся полем, я хочу, чтобы отображалось

last_name frst_name frst_name1 frst_name2 ....  

Подойдет любая база данных, предпочитаю оракула. ​​

Ответы [ 7 ]

12 голосов
/ 23 сентября 2010

Это должно работать практически на каждом диалекте SQL:

SELECT last_name, first_name FROM names
WHERE last_name IN (
    SELECT last_name FROM names GROUP BY last_name HAVING COUNT(*) > 1
)

Это даст вам набор результатов, подобный этому, хотя:

Smith     Jack
Smith     Joe
Smith     Anna
Sixpack   Joe
Sixpack   Eve

Самое элегантное решение для отображения этого в желаемом формате IMO - просто переупорядочить результирующий набор программно в клиентском приложении, вместо того, чтобы выполнять все виды неясных трюков SQL; что-то вроде (псевдокод):

for each row in resultset
   if row[last_name] <> previous_last_name
      print newline, print last_name
   print ' '
   print first_name
6 голосов
/ 23 сентября 2010

Предполагается, что на вашем сервере есть GROUP_CONCAT, потому что вы не упомянули, какой из них вы используете:

SELECT GROUP_CONCAT(first_name SEPARATOR ' ')
FROM table
GROUP BY last_name
HAVING COUNT(first_name) > 1
3 голосов
/ 23 сентября 2010

Ха, много запросов.Здесь больше

SELECT last_name, first_name FROM names n1
WHERE 
(
    SELECT count(*) FROM names n2 where n2.last_name = n1.last_name
) 
> 1

или если таблица имеет уникальный идентификатор

SELECT last_name, first_name FROM names n1
WHERE exists
(
    SELECT id FROM names n2 where n2.last_name = n1.last_name and n1.id <> n2.id
) 
2 голосов
/ 23 сентября 2010

Я не знаю, если это то, что вы просите, но я думаю, что вы ищете SELECT * FROM users u1, users u2 WHERE (u1.last_name = u2.last_name AND COUNT(u1.last_name) > 1))

2 голосов
/ 23 сентября 2010
Select a.* from persons a inner join persons b on (a.personID<>b.PersonID and a.last_name=b.last_name)

PersonID - это первичный ключ вашей таблицы.

1 голос
/ 23 сентября 2010

Я попытался разработать решение, которое бы работало на большинстве ANSI-совместимых серверов баз данных SQL. Вот что я придумал.

Идея в том, что вы идентифицируете дублированные last_name s, а затем извлекаете все записи, в которых есть один из этих дубликатов.

SELECT
   t.last_name, t.frst_name, t.frst_name1, t.frst_name2, ...
FROM our_table AS t
WHERE t.last_name IN (
   SELECT t0.last_name
   FROM our_table AS t0
   GROUP BY t0.last_name
   HAVING COUNT(*) > 1
)
ORDER BY
    t.last_name, t.frst_name, t.frst_name1, t.frst_name2, ...
;
0 голосов
/ 22 июля 2017

Предположим, «В таблице customer у вас есть customerkey как PK», тогда вы можете использовать:

select 
    customerkey,count(customerkey) 
from 
    customer 
group 
    by customerkey
having 
    count(customerkey)>1;

Это даст вам все дубликаты клиентских ключей.Теперь вы можете удалить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...