簡體   English   中英

遍歷臨時表的所有行以在另一個臨時表中設置值

[英]Loop through all the rows of temp table to set values in another temp table

我有一些復雜的情況需要處理。 我有一組存儲過程(每個搜索條件一個)可以根據我們在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的記錄連接起來,以返回所有所需的列。 請讓我知道如何在這里實現邏輯。 在此先多謝!

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

我可能有一些專欄文章,但沒有寫錯的地方,但我希望這會為您指明正確的方向!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM