2016-08-08 78 views
0

Ich bin mehrere Tabellen beitreten. Bei einem meiner Joins (1 zu vielen) möchte ich nur Ergebnisse anzeigen, wenn die verbundene Tabelle mindestens eine Zeile hat, in der ein bestimmter Wert existiert.SQL Server 2000 Join mit Count-Bedingung

Dieses Beispiel schließt das andere schließt sich, so der Einfachheit halber:

SELECT 
    c.Name, r.RoleID, r.RoleName 
FROM 
    Contact c 
INNER JOIN 
    Role r ON r.ContactID = c.ID 

Ein Kontakt kann viele Rollen haben. Ich möchte alle Rollen für Kontakte anzeigen, bekomme aber nur die Kontakte, bei denen mindestens eine Rolle die RollenID = 4 hat. Ich habe einige Dinge versucht, aber bisher keinen Erfolg. Wenn es darauf ankommt, ist dies auf SQL Server 2000

ich den Umfang des Problems in diese neue Frage erweitert: SQL Server 2000 condition on joined table

+1

Sql Server 2000 ist weit hinter Ende des Lebens. Das bedeutet, dass es keine Updates mehr erhält ... _nicht einmal kritische Sicherheitspatches! _ Es ist gefährlich und unverantwortlich, es weiterhin zu benutzen. Aktualisieren dieses Servers ist Job # 1. –

+0

Ich kann Ihnen nicht mehr zustimmen, und dieser Server wird später im Jahr von einer anderen Abteilung aktualisiert. – Kershaw

+0

Ich habe den Umfang des Problems in diese neue Frage erweitert: http://stackoverflow.com/questions/38839917/sql-server-2000-condition-on-joined-table – Kershaw

Antwort

1

Machen Sie den Beitritt zweimal, einmal, wo Sie auf ID 4 als Filter begrenzen, und wieder in alle Rollen ziehen:

SELECT 
    c.Name, r.RoleID, r.RoleName 
FROM 
    Contact c 
INNER JOIN --if a Contact does not match any Roles with ID 4, this join will exclude that contact from the results 
    Role rt /*role temp*/ ON rt.ContactID = c.ID AND rt.RoleId = 4   
INNER JOIN 
    Role r ON r.ContactID = c.ID 

Dies macht eine Annahme, die nicht explizit in der Frage angegeben wurde. Während ein Kontakt viele Rollen haben kann, setzt dies voraus, dass einem Kontakt nicht mehr als einmal dieselbe Rolle zugewiesen wird.

+0

Guter Punkt, und tatsächlich kann ein Kontakt eine Rolle mehr als einmal haben, da es andere Eigenschaften im Rollensatz gibt, die die gleichen Rollen für einen bestimmten Kontakt unterscheiden. – Kershaw

+0

In diesem Fall ist es am besten, auf das Server-Upgrade zu warten, da neuere Versionen von Sql Server es Ihnen erlauben, mit dem APPLY-Operator den 1. JOIN zu erstellen, mit dem Sie sich auf ein Ergebnis beschränken können. –

+0

Nun, das ist zu diesem Zeitpunkt keine wirkliche Option. Ich verwende diese Abfrage, um bei einer Aufgabe zu helfen, und diese Aufgabe ist bereits überfällig! Thx für Ihre Eingabe, kann es mich zu einer Lösung führen. – Kershaw

0

Sie können EXISTS verwenden:

SELECT 
    c.Name, r.RoleID, r.RoleName 
FROM 
    Contact c 
INNER JOIN 
    Role r ON r.ContactID = c.ID 
WHERE EXISTS(SELECT 1 FROM Role 
      WHERE RoleID = 4 
      AND ContactID = c.ID); 
+0

Ihre Lösung funktioniert auch, aber wenn ich die hereinbringe andere Tabellen, denen ich beitreten möchte Ich stoße auf Probleme, bei denen nicht alle zurückgegebenen Kontakte eine roleID = 4 haben, aber einige von ihnen tun dies. Sie haben auf die gestellte Frage eine funktionierende Antwort gegeben und verdienen daher Anerkennung dafür. – Kershaw

0

Sind Sie versuchen

+0

Diese Antwort gibt NUR die Rollen mit der Rollen-ID = 4 und keine anderen Rollen zurück. – Kershaw

+0

Sie können wie dass verwenden SELECT c.Name, r.RoleID, r.RoleName VON Kontakt c INNER Rolle r ON r.ContactID = c.ID JOIN wo c.ID in ( r SELECT. ContactID FROM Rolle r Gruppe von r.ContactID mit min (r.RoleID) = 4)) –

+0

RoleID beginnt bei 1, und ein Kontakt könnte eine RoleIDs von 1, 3, 4, 22 usw. So scheint es dass "min (r.RoleID) = 4)" Kontakte mit RoleID <4 auslassen würde? – Kershaw