首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否逐行比较rows...row的值?

是否逐行比较rows...row的值?
EN

Stack Overflow用户
提问于 2014-05-30 01:56:13
回答 1查看 230关注 0票数 1

我有一个小查询,它将一些临时表连接在一起,如下所示

代码语言:javascript
复制
select u.batch_uid, u.user_id, u.firstname, u.middlename, u.lastname, u.email, u.student_id, u.row_status, uff.batch_uid, uff.user_id, uff.firstname,uff.middlename,uff.lastname,uff.email, uff.student_id,uff.row_status
from users u full outer join users_feed_file uff on u.user_id = uff.user_id
where u.data_src_pk1 = 83

例如,结果可能是这样的:

代码语言:javascript
复制
(users as u) batch_uid user_name row_status (users_feed_file as uff) batch_uid user_name row_status
            johndoe   johndoe            2                           johndoe   johndoe            0

因为,前3列来自从活动表复制的源表。最后3列来自提要文件,该提要文件经过处理并插入到临时表中,然后在运行时完成后被删除(并在稍后使用新数据重新加载)。

我想要完成的基本上就是查看行来执行各种操作。我将检查近25,000行。因此,在这种情况下,我想要做的是检查如下内容

代码语言:javascript
复制
if u.batch_uid, u.user_name, u.row_status is not null
and
uff.uid, uff.user_name, uff.row_status is not null
and u.row_status is equal to 2 and uff.row_status is equal to 0
add user to feed file to enable him

但是,这些(以及其他类型的条件和检查)需要针对返回的全部25k行进行,然后在C#中逐行处理,以确定我的代码是否需要在文件中插入一行。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2014-06-06 01:04:02

在你的问题中,你有几个不同的问题要解决。

首先,在最初的SELECT中,您使用了一个完整的外连接--但是您显式地查找这样的记录:(表) User中的三个字段与(表) UserFeed中的三个字段相匹配。通过使用内部连接,您将看到显著更好的性能--并且处理的记录要少得多,如下所示:

代码语言:javascript
复制
SELECT u.batch_uid, u.user_id, u.firstname, 
u.middlename, u.lastname, u.email, u.student_id, 
u.row_status, uff.batch_uid, uff.user_id, uff.firstname, 
uff.middlename, uff.lastname, uff.email, uff.student_id, 
uff.row_status
FROM users u 
INNER JOIN users_feed_file uff 
ON u.user_id = uff.user_id
WHERE u.data_src_pk1 = 83
AND u.row_status = 2
AND uff.row_status = 0;

这将只给出符合您的完整条件的行--它应该是一个相对较小的行集。

但是--如果只是从(表)用户中检索记录来与(表) UserFeedFile进行比较,为什么要获取用户的名称、地址等呢?不需要--只需获取所需的数据:

代码语言:javascript
复制
SELECT u.user_id
FROM user U
INNER JOIN userfeedfile UFF
ON U.user_id = UFF.user_id
WHERE U.row_status = 2
AND UFF.row_status = 0
AND U.data_src_pkt1 = @PacketNumber;   -- That's a parameter

下一个问题是:您将如何处理这些行?如果要更新另一个表(或者User Feed File表)中的字段值,可以使用INSERT或update语句完成。要更新(表) UserFeedFile,请执行以下操作:

代码语言:javascript
复制
UPDATE userfeedfile
SET enabled = 1
FROM user U
INNER JOIN userfeedfile UFF
ON U.user_id = UFF.user_id
WHERE U.row_status = 2
AND UFF.row_status = 0
AND U.data_src_pkt1 = @PacketNumber;

(您可以使用SET语句更改第二行,以更新您选择的任何一个或多个字段。)

作为一般规则,SQL数据库在数据集上工作得最好。如果您发现自己每次迭代数据集一行,特别是如果您要将数据呈现给不同的进程(可能是在不同计算机上的网络上)以处理.Net代码中的行,请停下来考虑如何在SQL Server中使用集合来执行此操作。性能差异将是戏剧性的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23939804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档