2016-04-26 55 views
5

Ho due tabelle che contengono le persone che lavorano nell'azienda e le loro informazioni sull'occupazione (quindi le persone sono una tabella, l'occupazione è un'altra). La tabella Persone contiene informazioni su dove vive la persona, contatto di emergenza, numero di telefono bla bla bla. La tabella Occupazione contiene informazioni su dove lavora, il capo più vicino e altro. Queste tabelle sono state danneggiate e ora contengono alcuni duplicati per misstake. Ora in entrambe le tabelle è presente un ID Persona, ma l'ID dell'occupazione si trova solo in Occupazione. Voglio entrambi i numeri su tutte le persone che sono state duplicate.Unire le rovine selezionare

Questo funziona perfettamente:

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 

restituire i seguenti valori (ma non include il numero di occupazione come potete vedere):

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 

Ora, per aggiungere l'id lavoro mi unisco a che tabella come questa:

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 

E tutto va a h ** l in un handbasket con il seguente r isultato:

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 

Come potete vedere ho sia PersonID e Employmentid ma ora ho solo ottenere uno di ciascuno (ripetuto il numero corretto di volte) in modo da non avere tutte le differenti PersonID e Employmentid nella mia lista .

Perché?

Cosa è successo con il mio join che ha fatto crashare la festa?

+0

Quale dialetto SQL/RDBMS? – Dummy00001

+0

Questo è scritto in MS SQL su MS SQL Server 2012. –

+0

Hai controllato se un 'Person' può essere' impiegato 'più volte? – William

risposta

1

Ok, facciamo alcuni dati di esempio;

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') 

farei la prima query in modo diverso, se si lavora fuori i duplicati in una sotto-selezionare sarebbe più facile, sarete quindi in grado di unirsi al tavolo di lavoro con nessun problema;

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 

Ricordarsi di pulire i tavoli temporanei;

DROP TABLE #People 
DROP TABLE #Employment 
+1

Questo ha risolto il mio problema grazie mille! Ancora un po 'curioso di sapere perché la mia versione non ha funzionato ... –

+0

EH !? Questo DIDNT risolve il mio problema. Lo ha risolto solo su alcuni ... ??? –

+0

Ok, aggiorna la domanda con i dati per un utente che non viene visualizzato come previsto. Mostraci tutte le colonne in Persone e tutte le colonne in Occupazione con i dati per l'unico utente. Potremo risolverlo da lì. –

0

Credo che si dovrebbe provare questo

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 

Sir preghiamo di controllare e rispondere a me

+0

Questo genera lo stesso problema del mio secondo tavolo, cioè il Personid si ripete senza cambiare. –

0

Il codice dovrebbe funzionare e non riesco a riprodurre il problema utilizzando i dati che ho fatto su. Il risultato che stai vedendo mi suggerisce che ci sono ID di persone multiple per carl johnsson nel tavolo di lavoro e che l'employmentid è diverso - anche se sembra uguale nel risultato. Puoi fornire le definizioni della tabella e i dati di esempio?