簡體   English   中英

比較行的值…逐行?

[英]Comparing values of rows…row by row?

我有一個小查詢,將諸如此類的一些臨時表連接在一起

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列來自供稿文件,該文件經過處理並插入到臨時表中,然后在運行時間完成后被刪除(並在以后重新加載新數據)。

我要完成的工作基本上是查看行以執行各種操作。 我將要檢查近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行進行,然后在C#中逐行處理以確定我的代碼是否需要在文件中插入一行。

謝謝。

您有幾個不同的問題要解決。

首先,在您的初始SELECT中,您使用的是FULL OUTER JOIN,但是您要顯式地查找(表)User中的三個字段與(表)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中使用集合做到這一點。 性能差異將是巨大的。

暫無
暫無

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

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