我有一个有点复杂的场景要处理。我有一组存储过程(每个搜索条件一个)来根据我们在SQL SERVER中选择的搜索条件搜索记录。例如,如果使用一个存储过程,它通过将"firstname"作为输入参数以根据名字进行搜索,从而返回一组列(记录)。
例如,存储过程根据某些连接返回record_id、record_check_id、memberid、memberlname、memberfname、address1、address2、city1、State1、Zip1和Phone。地址字段通过member_address这个条件来自member_address表。Record_id = records.record_id。现在我必须从另一个中获取这些地址字段如果record_check_id = 1,则表member_additional_address。
对于这个我尝试了这样的方式。
我得到所有符合成员名字段的记录作为我们的输入字段。
select a.record_id, a.record_check_id into #temp_table From
members b
inner loop join records a
on a.member_id = b.member_id
Where b.fname like @firstname
现在,我的要求是检查这些记录的record_check_id在临时表(#temp_table),如果它是1(1),我们需要从member_additional_address表中返回地址字段,而不是从member_address表中获取。如果一条记录有@record_check_id = 1,并且在@member_additional_address表中没有任何记录具有该record_id,那么我们需要显示来自member_address本身的详细信息。
为此,我创建了一个包含地址字段的临时表
declare @Addressinfo table
(
address1 varchar(30),
address2 varchar(30),
city varchar(30),
state char(2),
zip char(5))
下:While (Select Count(*) From #temp_table) > 0
if (record_check_id = 1)
update t
set
t.address1 = f.address1,
t.address2 = f.address2,
t.city = f.city,
t.state = f.state,
t.zip = f.zip,
t.zip_ext = f.zip_ext
from @Addressinfo t
join @member_additional_address f (nolock)
on t.record_id= f.record_id
where record_check_id = 1
.
.
.
.
.
//something like this
和下一步寻找通过连接记录表与@addressinfo temp_table的记录返回所有所需的列。请让我知道我如何在这里实现逻辑。提前感谢!
通常在SQL中您希望避免使用循环。您的第一个查询将归结为:
select
a.record_id,
a.record_check_id
into #temp_table
From
members b join records a
on a.member_id = b.member_id
Where b.fname like @firstname
它将以基于集合的方式执行相同的操作。
关于第二部分的简短说明,使用nolock通常是不被允许的,除非您对它的缺陷感到满意。如果你不确定它们是什么,那就不要用它。在这样的临时表上使用它可能在任何情况下都不会给您带来任何好处。现在,我将这样做,而不使用临时表的中间步骤:
select
a.record_id,
a.record_check_id,
isnull(f.address1,t.address1),
isnull(f.address2,t.address2),
isnull(f.city,t.city),
--etc--
From members b
join records a
on a.member_id = b.member_id
left join @member_additional_address f
on t.record_id= f.record_id and a.record_check_id = 1
left join @Address_info t on a.id = t.id -- I would join on where that address information is coming from
Where b.fname like @firstname
我可能有一些专栏和什么不围绕错误的方式,但我希望这将有助于指出你在正确的方向!