我有一张桌子Person:
Person
PersonID | FirstName | LastName ------------------------------- 1 | John | Doe 2 | Jane | Doe 3 | NoSpouse | Morales 4 | Jonathan | Brand 5 | Shiela | Wife
和一张Relationship表:
Relationship
RelationshipID | PersonID | Type | RelatedPersonID 1 | 1 | 3 | 2 2 | 2 | 3 | 1 3 | 4 | 3 | 5 4 | 5 | 3 | 4
所以基本上,我想结合配偶和客户的名字,但是我想排除配偶:
预期成绩:
1, John and Jane Doe, 2 ---------------------- 3, NoSpouse Morales, null ----------------------- 4, Jonathan and Shiela Brand, 5
我试过了:
SELECT p.PersonID, Case when spouse.PersonID is not null THEN p.FirstName + ' and ' + spouse.FirstName + ' ' + p.LastName ELSE p.FirstName + ' ' + p.LastName END as ClientName, spouse.PersonID as RelatedPersonID FROM Person p LEFT JOIN Relationship r on p.PersonID = r.PersonID LEFT JOIN Person spouse on r.RelatedPersonID = spouse.PersonID WHERE r.Type = 3 OR spouse.PersonID is null
但结果是:
1, John and Jane Doe, 2 ---------------------- 2, Jane and John Doe, 1 ---------------------- 3, NoSpouse Morales, null ----------------------- 4, Jonathan and Shiela Brand, 5 ------------------------------- 5, Shiela and Jonathan Wife, 4
这是一些模拟数据:
create table Person( PersonID int primary key, FirstName varchar(max), LastName varchar(max) ) insert into Person values (1, 'John', 'Doe'), (2, 'Jane', 'Doe'), (3, 'NoSpouse', 'Morales'), (4, 'Jonathan', 'Brand'), (5,'Shiela','Wife') create table Relationship ( RelationshipID int, PersonID int references Person(PersonID), Type int, RelatedPersonID int references Person(PersonID) ) insert into Relationship values (1, 1, 3, 2), (2, 2, 3, 1), (3, 4, 3, 5), (4, 5, 3, 4) SELECT p.PersonID, Case when spouse.PersonID is not null THEN p.FirstName + ' and ' + spouse.FirstName + ' ' + p.LastName ELSE p.FirstName + ' ' + p.LastName END as ClientName, spouse.PersonID as RelatedPersonID FROM Person p LEFT JOIN Relationship r on p.PersonID = r.PersonID LEFT JOIN Person spouse on r.RelatedPersonID = spouse.PersonID WHERE r.Type = 3 OR spouse.PersonID is null drop table Relationship drop table Person
在此先感谢您的帮助和时间。
注意: 我已经编辑了模拟脚本以包含3, NoSpouse Morales, null在结果中。另外,丈夫/妻子不需要特别的标准。列表中第一位获得的人不应包括相关配偶。
3, NoSpouse Morales, null
如果必须包含一个,而排除另一个,请尝试添加一个子句
AND r.PersonID < r.RelatedPersonID
因为ID将不相等,并且将仅包含以下任一个:
SELECT p.PersonID, Case when spouse.PersonID is not null THEN p.FirstName + ' and ' + spouse.FirstName + ' ' + p.LastName ELSE p.FirstName + ' ' + p.LastName END as ClientName, spouse.PersonID as RelatedPersonID FROM Person p LEFT JOIN Relationship r on p.PersonID = r.PersonID LEFT JOIN Person spouse on r.RelatedPersonID = spouse.PersonID WHERE (r.Type = 3 AND r.PersonID < r.RelatedPersonID) OR spouse.PersonID is null