gpt4 book ai didi

c# - 遍历 sql(SQL 或 Asp.net C#)的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-30 14:35:30 25 4
gpt4 key购买 nike

我正在创建一个列表来向其发送电子邮件。登录的个人在数据库中有一个他们向谁报告的字段(除非出现错误或他们不向任何人报告)。

例如,如果我登录并单击 SQL 中的提交按钮,它会说我向“John Doe”报告

然后我需要获取“John Doe”的报告对象并将其添加到列表中。我需要继续攀登名单,直到我们到达公司的顶端(GID 将为空白或 null)。

以我为例,我向 '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作为(从 dbo.CVT_Users_usr 选择 usrGID、RTRIM(usrFirstName) + ' ' + RTRIM(usrLastName) 作为名称、usrEmailAddress、usrReportsTo联合所有从 dbo.CVT_Users_usr 中选择 u.usrGID、RTRIM(u.usrFirstName) + ' ' + RTRIM(u.usrLastName)、cte.usrEmailAddress、cte.usrReportsTo 在 u.usrReportsTo = cte.usrGID 上加入 cte) 从 cte 选择 * 其中 Name = 'James Wilson'

-- 返回

usrGID 名称 usrEmailAddress usrReportsToE1DAFC11-BE35-4730-9961-68EEF8D85DE4 詹姆斯·威尔逊 38922F83-4B6E-499E-BF4F-EF0B094F47F7E1DAFC11-BE35-4730-9961-68EEF8D85DE4 James Wilson john@1234.com FB8F4939-3956-4834-9D89-D72AFB8BF3E0E1DAFC11-BE35-4730-9961-68EEF8D85DE4 詹姆斯·威尔逊 tom@1234.com 00000000-0000-0000-0000-000000000000

usrGID 和名称不应该像 usrEmailAddress 和 usrReportsTo 那样匹配吗?我尝试将 sql 更改为 cte.USRGID 和 cte.Name 但它给出了最大递归错误。

有什么想法吗?

最佳答案

使用公用表表达式,您可以在一个 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

关于c# - 遍历 sql(SQL 或 Asp.net C#)的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12045479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com