2016-04-26 6 views
5

Ich habe zwei Tabellen, die Menschen, die bei der Firma arbeiten und ihre Beschäftigung Informationen enthält (so ist Menschen ein Tisch, Beschäftigung ist ein anderer). Die People-Tabelle enthält Informationen darüber, wo die Person lebt, Notfallkontakt, Telefonnummer bla bla bla. Die Beschäftigungstabelle enthält Informationen darüber, wo er arbeitet, der nächste Chef und mehr. Diese Tabellen wurden beschädigt und enthalten nun einige Fehlalarme. Jetzt gibt es in beiden Tabellen eine Personen-ID, aber die Beschäftigungs-ID befindet sich nur in Beschäftigung. Ich möchte beide Nummern auf allen Personen, die dupliziert haben.Beitreten Ruine die select

Das funktioniert perfekt:

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 

folgende Werte zurückgegeben werden (aber nicht Beschäftigung Nummer enthalten, wie Sie sehen können):

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 

nun die Beschäftigung id ich, dass beitreten hinzufügen Tabelle wie folgt:

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 

Und alles geht zu h ** l in einem Handbasket mit den folgenden r eiter:

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 

Wie Sie ich beide PersonId und Employmentid erhalten sehen, aber jetzt habe ich nur eine von jeder (wiederholt die korrekte Anzahl) erhalten, so habe ich nicht alle verschiedenen PersonId und Employmentid in meiner Liste .

Warum?

Was ist mit meinem Beitritt passiert, der die Party abgestürzt ist?

+0

Was SQL-Dialekt/RDBMS? – Dummy00001

+0

Dies ist in MS SQL auf MS SQL Server 2012 geschrieben. –

+0

Haben Sie überprüft, ob eine "Person" kann mehrere Male "beschäftigt" werden? – William

Antwort

1

Ok, lassen Sie uns einige Beispieldaten machen;

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

ich anders die erste Abfrage tun würde, wenn Sie die Duplikate in einem ausrechnen Unter wählen Sie es einfacher sein würde, werden Sie dann in der Lage sein, auf die Beschäftigung Tabelle ohne Probleme zu verbinden;

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 

Denken Sie daran, die Temp-Tabellen zu bereinigen;

DROP TABLE #People 
DROP TABLE #Employment 
+1

Das löste mein Problem sehr dank! Noch ein bisschen neugierig, warum meine Version nicht funktioniert hat ... –

+0

EH !? Dieses DIDNT löst mein Problem. Es löste es nur auf ein paar ... ??? –

+0

Ok, aktualisieren Sie die Frage mit den Daten für einen Benutzer, der nicht wie erwartet angezeigt wird. Zeigen Sie uns alle Spalten in Personen und alle Spalten in Beschäftigung mit den Daten für den einen Benutzer an. Wir werden es von dort aus erarbeiten können. –

0

Ich denke, Sie sollten versuchen, diese

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 bitte

+0

Dies erzeugt das gleiche Problem wie meine eigene zweite Tabelle, d. H. Die Personid wiederholt sich ohne zu ändern. –

0

Ihr Code für mich prüfen und beantworten arbeiten, und ich bin nicht in der Lage Ihr Problem Daten zu reproduzieren, indem ich oben gemacht haben. Das Ergebnis, das Sie sehen, deutet darauf hin, dass es für carl johnsson mehrere Personen-IDs in der Beschäftigungstabelle gibt und dass die Beschäftigungs-ID anders ist - auch wenn es in der Ausgabe gleich aussieht. Können Sie Ihre Tabellendefinitionen und Beispieldaten angeben?