SQL Server | Выбрать все конкретные дубликаты в столбцах - PullRequest
0 голосов
/ 23 января 2019

Моя проблема сейчас заключается в том, что мне нужно сделать заявление, в котором выберите все строки, которые являются дубликатами с конкретными потребностями.

Например, я получил таблицу 1 (пользователи):

Users:
----------------------------------------------
ID  name   lastname   birth       file number
1   Max    Lix        2015-02-01  D43-892
2   Chris  Maura      2010-12-25  E33-722
4   Lena   Paul       2005-05-11  S85-458
5   Max    Lix        2019-02-01  D23-992
6   Lena   Paul       2005-05-11  S84-488
7   Lena   Paul       2005-05-11  S75-258
----------------------------------------------

Address(u_ID = ID of Users table):
----------------------------------------------
ID   u_ID   Street   number   zip
1    1      Heystr.  12       4556
2    2      Nostr.   2        8978
3    4      Yesstr.  8a       2545

Мне нужно получить все строки, в которых имя, фамилия и рождение совпадают с другими строками, а также получить адрес для этого человека.

Результат должен выглядеть следующим образом:

 Result:
 ----------------------------------------------
 name   lastname   birth       filenumber   address
 Max    Lix        2015-02-01  D43-892      Heystr. 12 4556
 Max    Lix        2019-02-01  D23-992      Heystr. 12 4556
 Lena   Paul       2005-05-11  S85-458      Yesstr. 8a 2545
 Lena   Paul       2005-05-11  S84-488      Yesstr. 8a 2545
 Lena   Paul       2005-05-11  S75-258      Yesstr. 8a 2545

Первая идея, которая у меня возникла, состояла в том, чтобы использовать GROUP BY и HAVING, но это возвращает только одну строку, но мне нужен каждый дубликат, соответствующий имени, фамилии и рождению.

Ответы [ 4 ]

0 голосов
/ 23 января 2019

Пожалуйста, попробуйте ниже,

  select U.name,U.lastname,U.birth,U.filenumber,concat(street,' ',number,' ',zip) as address
    from Users U join Address A on 
    U.ID=A.u_Id
    group by name,lastname,birth
    having count(*)>1
0 голосов
/ 23 января 2019

Используйте это:

select u.name, u.lastname, u.birth, u.filenumber, concat(a.street, ' ', a.number, ' ', a.zip) address
from users u
left join address a
on a.u_id = u.id
where 
  exists (
    select 1 from users 
    where users.name = u.name and user.lastname = u.lastname and user.birth = u.birth and users.id <> u.id
)

С условием:

users.name = u.name and user.lastname = u.lastname and user.birth = u.birth and users.id <> u.id

вы можете найти дубликаты.
Используйте inner join вместо left join, если вы хотите дубликаты только один раз.

0 голосов
/ 23 января 2019
SELECT name, lastname, birth, filenumber, concat(street,' ' , number, ' ', zip) as address
  FROM Users A, Adress
 WHERE u_id = a.id
   AND (SELECT COUNT(1)
          FROM Users B
         WHERE A.name = B.name
           AND A.lastname = B.lastname) > 1
0 голосов
/ 23 января 2019
with duplicate as ( -- this CTE makes a list of duplicated user_IDs

   Select u.id
    from users 
    group by name, lastname, birth
    having count(*) >= 2
)

    Select concat(street,' ' , number, ' ', zip) as address, 
           name, lastname, birth, filenumber 
    from duplicates d -- gather the data
                      join addresses on d.id=uid 
                      join users on u.id=d.uid

вернет вам отчет обо всех людях, имеющих омоним с таким же днем ​​рождения

...