【问题标题】:Loop through all the rows of temp table to set values in another temp table循环遍历临时表的所有行以在另一个临时表中设置值
【发布时间】:2015-08-03 22:45:29
【问题描述】:

我需要处理一些复杂的场景。我有一组存储过程(每个搜索条件一个)来根据我们在 SQL SERVER 中选择的搜索条件搜索记录。 例如,如果您采用一个存储过程,它会通过将“名字”作为输入参数返回一组列(记录),以根据名字进行搜索。

例如,存储过程基于一些连接返回record_id、record_check_id、memberid、memberlname、memberfname、address1、address2、city1、State1、Zip1和Phone。 在此条件下,地址字段来自表 Member_adress 表,Member_adress.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  

现在,我的要求是检查临时表(#temp_table)中这些记录的record_check_id,如果它是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 的记录连接起来来返回所有所需的列。 请让我知道如何在这里实现逻辑。提前非常感谢!

【问题讨论】:

  • 你能发布member_addressmember_additional_address的表结构吗?
  • 两者具有相同的列(结构):地址 1、地址 2、城市、州、邮编.. @FelixPamittan

标签: sql sql-server loops temp-tables


【解决方案1】:

通常,在 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     

我可能有一些专栏,但我希望这能帮助您指出正确的方向!

【讨论】:

  • 您好,谢谢您的回答,但它不起作用..您的回答似乎没有使用我们在第一个 sn-p 中创建的临时表,我需要根据 record_check_id 获取地址在记录表中..您能否提供一些更详细的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
相关资源
最近更新 更多