Bernard West ( ) writes:
> I want to select the records from [Person] who have a contract
> corresponding to a [Post] in a particular department. If I do the
> basic
>
> SELECT PersonID, FirstName, Surname
> FROM Person INNER JOIN
> Contract ON Person.PersonID = Contract.PersonID
> INNER JOIN
> Post ON Contract.PostID = Post.PostID
> WHERE (Post.Department = N'Department')
>
> I obviously get duplicates where there are multiple contracts for one
> person. What I need is something that does the same job as
>
> SELECT PersonID, FirstName, Surname
> FROM Person INNER JOIN
> (SELECT DISTINCT Contract.PersonID
> FROM Contract INNER JOIN
> Post ON
> Contract.PostID = Post.PostID
> WHERE (Post.Department =
> 'Department')) AS DepartmentFilter ON Person.PersonID =
> DepartmentFilter.PersonID
>
> but which lets me edit the information returned - this version is read-
> only.
Rather than joining, use EXISTS:
SELECT P.PersonID, P.FirstName, P.Surname
FROM Person P
WHERE EXISTS (SELECT *
FROM Contracts C
JOIN Post ON C.PostID = Post.PostID
WHERE Post.Department = 'Department'
AND P.PersonID = C.PersonID)
--
Erland Sommarskog, SQL Server MVP, esquel DeleteThis @sommarskog.se
Links for SQL Server Books Online:
SQL 2008:
http://msdn.microsoft.com/en-us/sqlserver/cc514207.aspx
SQL 2005:
http://msdn.microsoft.com/en-us/sqlserver/bb895970.aspx
SQL 2000:
http://www.microsoft.com/sql/prodinfo/previousversions/books.mspx