【发布时间】:2009-12-05 01:28:41
【问题描述】:
我已尝试通过在此处发布其他关注部分查询的相关问题来解决此问题。但是,我不妨张贴整个事情,看看是否有人可以提供帮助。我有以下表格,其中包含以下字段:
tblPerson - PersonID、PersonName
tblGroup - 组 ID、名称
tblGroupMembership - PersonID、GroupID
tblPersonCities - CityID、PersonID、城市
这是一个非常简单的设置。我们有 Person 和 Group,GroupMembership 是两者之间的多对多连接。然后人们可以拥有多个城市。
我要做的是编写一个存储过程,用于根据几个不同的参数搜索这些数据。存储过程将只返回人员信息。存储过程应采用 3 个参数:
@PersonName - 人名或人名的一部分
@GroupIDList - 以逗号分隔的 GroupID 列表
@City - 城市名称或城市名称的一部分
我希望存储过程能够不需要任何参数的值。因此,如果所有参数都为 NULL,那么它应该返回所有 Person 记录。如果传入 GroupID 列表,则它应该只返回与传入列表中的所有组匹配的人员记录。我希望我已经正确解释了这一点。我知道这是一个很长的问题,但我无法以任何其他方式解释它。我有一些几乎可以工作的代码。唯一的问题是,如果所有参数都为 NULL,它似乎不起作用。 (而且我还没有弄清楚如何引入城市)这是我的代码示例。 (注意:fnSplit 是一个自定义函数,它接受一个逗号分隔的字符串并返回一个具有不同值的表)
declare @name varchar(50)
declare @city varchar(50)
declare @grouplist varchar(50)
set @name = null
set @city = null
set @grouplist = null
select distinct
p.PersonID,
p.PersonName,
c.City
from
tblPerson p left join tblCities c on p.PersonID = c.PersonID
join
(
select m.PersonID
from tblGroupMembership m
where (m.GroupID in (select item from fnSplit(@grouplist, ',')))
group by m.PersonID
having (count(*) = (select count(*) from fnSplit(@grouplist, ',')))
) as filter
on (@grouplist is not null) and (p.PersonID = filter.PersonID)
where
((@name is null) or (p.PersonName like '%' + @name + '%')) and
((@city is null) or (c.City like '%' + @city + '%'))
【问题讨论】:
标签: sql sql-server tsql join