2016-04-26 2 views
5

У меня есть две таблицы, в которых содержатся люди, которые работают в компании и их данные о занятости (так что люди - это одна таблица, занятость - другая). Таблица людей содержит информацию о том, где живет человек, экстренный контакт, номер телефона bla bla bla. Таблица занятости содержит информацию о том, где он работает, ближайший босс и многое другое. Эти таблицы были повреждены и теперь содержат несколько дубликатов по ошибке. Теперь в обеих таблицах есть идентификатор Person, но идентификатор занятости находится только в занятости. Мне нужны оба числа для всех людей, которые были дублированы.Присоединиться к развалинам выбрать

Это отлично работает:

SELECT DISTINCT 
    pp.Personid, 
    pp.Firstname, 
    pp.Lastname, 
    pp.Address, 
FROM People pp 
JOIN People pp2 
    ON pp.Firstname = pp2.Firstname 
    AND pp.Lastname = pp2.Lastname 
    AND pp.Address = pp2.Address 
    AND pp.Personid <> pp2.Personid 
ORDER BY pp.Firstname, pp.Lastname, pp.Personid 

возвращаются следующие значения (но не включает в себя количество занятости, как вы можете видеть):

1001 Carl Johnsson Bigstreet 1 
1002 Carl Johnsson Bigstreet 1 
1003 Carl Johnsson Bigstreet 1 
1010 Andrew Wilkinsson Smallstreet 2 
1011 Andrew Wilkinsson Smallstreet 2 

Теперь, чтобы добавить идентификатор занятости я присоединиться к тем, стол, подобный этому:

SELECT DISTINCT 
    pp.Personid, 
    e.Employmentid, 
    pp.Firstname, 
    pp.Lastname, 
    pp.Address, 
FROM People pp 
JOIN People pp2 
    ON pp.Firstname = pp2.Firstname 
    AND pp.Lastname = pp2.Lastname 
    AND pp.Address = pp2.Address 
    AND pp.Personid <> pp2.Personid 
JOIN Employment e on pp.Personid = e.Personid 
ORDER BY pp.Firstname, pp.Lastname, pp.Personid 

И все идет к h ** l в корзине со следующим r esult:

1001 1111 Carl Johnsson Bigstreet 1 
1001 1111 Carl Johnsson Bigstreet 1 
1001 1111 Carl Johnsson Bigstreet 1 
1010 1234 Andrew Wilkinsson Smallstreet 2 
1010 1234 Andrew Wilkinsson Smallstreet 2 

Как вы можете видеть, я получаю как PersonId и Employmentid, но теперь я только получить один из каждого (повторяющееся правильное число раз), поэтому я не все различные PersonId и Employmentid в моем списке ,

Почему?

Что случилось с моим соединением, которое разбило вечеринку?

+0

Какой диалект SQL/RDBMS? – Dummy00001

+0

Это написано в MS SQL на сервере MS SQL 2012. –

+0

Вы проверили несколько раз «один человек»? – William

ответ

1

Хорошо, давайте сделаем некоторые данные образца;

CREATE TABLE #People (PersonID int, FirstName varchar(50), LastName varchar(50), Address1 varchar(50)) 

INSERT INTO #People (PersonID, FirstName, LastName, Address1) 
VALUES 
('1','Mike','Hunt','Cockburn Crescent') 
,('2','Mike','Hunt','Cockburn Crescent') 
,('3','Mike','Hunt','Cockburn Crescent') 
,('4','Connie','Lingus','Dyke Close') 
,('5','Connie','Lingus','Dyke Close') 
,('6','Eric','Shun','Tickle Avenue') 
,('7','Ivana','Humpalot','Bottom Street') 

CREATE TABLE #Employment (PersonID int, EmploymentID int) 

INSERT INTO #Employment (PersonID, EmploymentID) 
VALUES 
('1','10') 
,('2','11') 
,('3','12') 
,('4','13') 
,('5','14') 
,('6','15') 
,('7','16') 

я сделаю первый запрос другому, если вы работаете дублирующие в суб-выбора, было бы проще, то вы будете в состоянии присоединиться к таблице занятости без каких-либо проблем;

SELECT pp.PersonID 
    ,em.EmploymentID 
    ,pp.FirstName 
    ,pp.LastName 
    ,pp.Address1 
FROM #People pp 
JOIN (
    SELECT FirstName 
     ,LastName 
     ,Address1 
     ,COUNT(1) records 
    FROM #People 
    GROUP BY FirstName 
     ,LastName 
     ,Address1 
    HAVING COUNT(1) > 1 
    ) pp2 ON pp.FirstName = pp2.FirstName 
    AND pp.LastName = pp2.LastName 
    AND pp.Address1 = pp2.Address1 
LEFT JOIN #Employment em ON pp.PersonID = em.PersonID 

Не забудьте очистить временные таблицы;

DROP TABLE #People 
DROP TABLE #Employment 
+1

Это решило мою проблему, спасибо большое! Все еще немного любопытно, почему моя версия не работает ... –

+0

EH !? Этот DIDNT решает мою проблему. Он только решил это на несколько ... ??? –

+0

Хорошо, обновите вопрос с данными для пользователя, который не отображается, как вы ожидаете. Покажите нам все столбцы в «Люди» и все столбцы «Занятость» с данными для одного пользователя. Оттуда мы сможем это сделать. –

0

Я думаю, вы должны попробовать это

SELECT DISTINCT 
      ep.Personid, 
      ep.Employementid, 
      ep.FirstName, 
      ep.LastName, 
      ep.Address 
FROM Person P join 
(SELECT 
    pp.Personid, 
    e.Employmentid, 
    pp.Firstname, 
    pp.Lastname, 
    pp.Address, 
from PP 
JOIN Employment e on pp.Personid = e.Personid) ep 
on 
    P.Firstname = ep.Firstname 
    AND P.Lastname = ep.Lastname 
    AND P.Address = ep.Address 
    AND P.Personid <> ep.Personid 
ORDER BY P.Firstname, P.Lastname, P.Personid 

Сэр, пожалуйста, проверьте и ответить мне

+0

Это порождает ту же проблему, что и моя вторая вторая таблица, т. Е. Персонаж повторяет, не меняя. –

0

Ваш код должен работать, и я не в состоянии воспроизвести проблему с помощью данных я составленную. Результат, который вы видите, подсказывает мне, что в таблице занятости есть несколько идентификаторов человека для carl johnsson и что занятость различна - хотя она выглядит одинаково на выходе. Можете ли вы предоставить свои определения таблиц и образцы данных?

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