2016-12-23 16 views
2

die folgende Tabelle ManagerRepRelationship Gegeben:finden nicht doppelten Wert in einer Spalte auf der Basis bekannter Wert einer anderen Spalte

repId managerId 
35  33 
36  33 
37  33 
23  56 
26  60 
35  34 
37  34 

Wie Sie sehen können, Manager 33 und Manager 34 beide Aktien Vertreter 35 und 37. Wenn ich haben nur den bekannten Wert von Manager 33:

SELECT repId FROM ManagerRepRelationship WHERE managerId=33 

ich komme 35,36,37 bekommen.

Meine Frage hier ist, basierend nur zu wissen, dass managerId, gibt es eine Möglichkeit zu sehen, ob die zurückgegebenen repId keinen anderen doppelten Wert in dieser repId Spalte in der gesamten Tabelle haben.

Also in der obigen Aussage möchte ich die rep finden, die nur eine Beziehung hat. In diesem Fall wäre repId 36 also die Rückkehr, die ich möchte, weil 33 der einzige Manager für diesen Rep ist.

Kann dies in einer SQL-Anweisung erfolgen?

Antwort

1

Sie müssen die gleiche Tabelle wieder in einer Unterabfrage verweisen für Ihre anderen Zustand zu überprüfen:

SELECT repId FROM ManagerRepRelationship a WHERE managerId=33 
AND not exists (SELECT 1 FROM ManagerRepRelationship b WHERE b.repId = a.repId and b.managerId <> a.managerId) 
0

Sie zur Gruppe zählen die rep_id haben und dann.

SELECT repId FROM ManagerRepRelationship WHERE 
repId IN (SELECT repId FROM ManagerRepRelationship WHERE managerId=33) 
GROUP BY repId 
HAVING COUNT(repId) = 1 

(nicht getestet)

+0

Wird nicht funktionieren. 'WHERE' gilt vor' GROUP BY', also werden Datensätze mit 'managerId! = 33' aus dem' COUNT' ausgeschlossen –

+0

Danke! Ich habe es zu etwas geändert, das funktionieren sollte. –

1
DECLARE @DataSource TABLE 
(
    [repId] TINYINT 
    ,[managerId] TINYINT 
); 

INSERT INTO @DataSource ([repId], [managerId]) 
VALUES (35, 33) 
     ,(36, 33) 
     ,(37, 33) 
     ,(23, 56) 
     ,(26, 60) 
     ,(35, 34) 
     ,(37, 34); 

SELECT DS1.* 
FROM @DataSource DS1 
LEFT JOIN @DataSource DS2 
    ON DS1.[repID] = DS2.[repId] 
    AND DS2.[managerId] <> 33 
WHERE DS1.[managerId] = 33 
    AND DS2.[repId] IS NULL; 
+0

Ich überarbeite meinen Kommentar ... Ich sehe, dass viel von der Komplexität, die Sie gepostet haben, eher eingerichtet als beantwortet wurde. Ich stehe aber zu meiner -1 für eine unklare Antwort. –

+0

Und wie kann ein 'LINKER JOIN' unklar sein? – gotqn

+0

Ursprünglich wurde die Antwort aufgrund des unnötigen Setup-Codes falsch gelesen. Ich habe meinen Kommentar entsprechend bearbeitet. Sie sehen, dass Sie DML und mehrere Abfragen gepostet haben, richtig? Sie fragen sich, warum das verwirrend ist? –

0

Es gibt ein paar Möglichkeiten, es zu tun. Hier ist eine:

select m33.repId 
    from   ManagerRepRelationship m33 
     left join ManagerRepRelationship mOther 
       on m33.repId = mOther.repId 
      and mOther.managerId != m33.managerId 
where m33.managerId = 33 
    and mOther.repId is NULL 
Verwandte Themen