簡體   English   中英

循環遍歷sql(SQL或Asp.net C#)的最佳方法是什么?

[英]What is the best way to loop through sql (SQL or Asp.net C#)?

我正在創建一個發送電子郵件的列表。 登錄的個人在數據庫中有一個他們向誰報告的字段(除非出現錯誤或他們向任何人報告)。

因此,例如,如果我登錄並單擊SQL中的提交按鈕,它會說我向'John Doe'報告

然后,我需要抓住“John Doe”報告的人並將其添加到列表中。 我需要繼續攀登列表,直到我們到達公司的頂部(GID將為空或空)。

以我為例,我向'John Doe'報告,他向'Tom Doe'匯報。 Tom向沒有人報告他的usrReportsTo字段就像這個'00000000-0000-0000-0000-000000000000'

如果usrReportsTo字段為""NULL'00000000-0000-0000-0000-000000000000'則循環應終止。

這是我用過的sql。

執行此循環的最干凈/最好/最有效的方法是什么?在SQL或ASP.net C#中更好嗎?

select usrReportsTo from dbo.CVT_Users_usr, usrEmailAddress
WHERE RTRIM(usrFirstName) + ' ' + RTRIM(usrLastName) = 'James Wilson' 
-- Returns 'James Wilson' + email

SELECT RTRIM(usrFirstName) + ' ' + RTRIM(usrLastName) as Name, usrEmailAddress, usrReportsTo from dbo.CVT_Users_usr
WHERE usrGID = '38922F83-4B6E-499E-BF4F-EF0B094F47F7'
-- Returns 'John Doe' + email + reportsTo

SELECT RTRIM(usrFirstName) + ' ' + RTRIM(usrLastName) as Name, usrEmailAddress, usrReportsTo from dbo.CVT_Users_usr
WHERE usrGID = 'FB8F4939-3956-4834-9D89-D72AFB8BF3E0'
-- Returns 'Tom Doe' + email + reportsTo

編輯#3

SQL的工作副本不會返回100%真實數據。

使用cte AS(選擇usrGID,RTRIM(usrFirstName)+''+ RTRIM(usrLastName)作為名稱,usrEmailAddress,usrReportsTo來自dbo.CVT_Users_usr union all選擇u.usrGID,RTRIM(u.usrFirstName)+''+ RTRIM(u。 usrLastName),cte.usrEmailAddress,cte.usrReportsTo來自dbo.CVT_Users_usr u inner join cte on u.usrReportsTo = cte.usrGID)select * from cte where Name ='James Wilson'

- 退貨

usrGID名稱usrEmailAddress usrReportsTo E1DAFC11-BE35-4730-9961-68EEF8D85DE4 James Wilson 38922F83-4B6E-499E-BF4F-EF0B094F47F7 E1DAFC11-BE35-4730-9961-68EEF8D85DE4 James Wilson john@1234.com FB8F4939-3956-4834-9D89-D72AFB8BF3E0 E1DAFC11 -BE35-4730-9961-68EEF8D85DE4 James Wilson tom@1234.com 00000000-0000-0000-0000-000000000000

usrGID和名稱是否應該與usrEmailAddress和usrReportsTo相同? 我嘗試將sql變為cte.USRGID和cte.Name,但它給出了最大遞歸錯誤。

有任何想法嗎?

使用common table expression您可以在一個SQL語句中生成完整的結果集(通過遞歸連接),從而避免任何循環。

關鍵字段的基本示例

create table #CVT_Users_usr (usrGid uniqueidentifier, usrEmailAddress varchar(50), usrFirstName varchar(20), usrLastName varchar(20), usrReportsTo uniqueidentifier)

insert #CVT_Users_usr values    
('38922F83-4B6E-499E-BF4F-EF0B094F47F7' , 'james@wilson.com','james','wilson', 'E1DAFC11-BE35-4730-9961-68EEF8D85DE4'),
('E1DAFC11-BE35-4730-9961-68EEF8D85DE4', 'john@doe.com','john','doe', 'FB8F4939-3956-4834-9D89-D72AFB8BF3E0'),
('FB8F4939-3956-4834-9D89-D72AFB8BF3E0', 'tom@doe.com','tom','doe' ,'00000000-0000-0000-0000-000000000000'),
('FE6899A5-63BA-42B7-A70E-011711A5FAC6', 'ken@ken.com','ken', 'kenneths', 'FB8F4939-3956-4834-9D89-D72AFB8BF3E0')

declare @id uniqueidentifier
select @id = usrGid from #CVT_Users_usr where usrFirstName='james' and usrLastName='wilson'

;with cte as
(
select usrGid, usrEmailAddress, usrFirstName, usrLastName, usrReportsTo from #CVT_Users_usr
union all
select u.usrGid,  cte.usrEmailAddress, cte.usrFirstName, cte.usrLastName, cte.usrReportsTo 
from #CVT_Users_usr u
    inner join cte on u.usrReportsTo= cte.usrGid
)
    select usrFirstName + ' ' + usrLastName, usrEmailAddress  from cte
    where usrGid=@id

drop table #CVT_Users_usr

暫無
暫無

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

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