行的比较......逐行比较?

时间:2014-05-29 17:56:13

标签: c# sql sql-server tsql

我有一个小的查询将一些像这样的临时表连接在一起

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

结果将是这样的:

(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列来自一个feed文件,它被处理并插入到临时表中,然后在运行时间完成后被删除(稍后用新数据重新加载)。

我想要完成的工作主要是查看行以执行各种操作。我要检查近25,000行。所以在这种情况下,我想做的就是检查

之类的东西
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行进行,然后逐行处理,以确定我的代码是否需要在文件中插入一行。 / p>

谢谢。

1 个答案:

答案 0 :(得分:0)

您的问题中有几个不同的问题需要解决。

首先,在您的初始SELECT中,您正在使用FULL OUTER JOIN - 但是您明确地查找记录,其中(表)User中的三个字段与(table)UserFeed中的三个字段匹配。你会看到更好的性能 - 并且处理更少的记录 - 使用INNER JOIN,如下所示:

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进行比较,为什么要获取用户的姓名,地址等?不需要 - 只需获取您想要的数据:

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,请执行以下操作:

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中使用集合来完成它。性能差异将是戏剧性的。