操作完全相同多行資料中某些行

2021-07-10 19:41:46 字數 1601 閱讀 7519

架設有如下資料:

declare @tb table (col1 int,col2 varchar(100))

insert

into @tb values (10,'a'), (11,'b'), (10,'a'), (10,'a'), (10,'a'), (10,'a'), (10,'a'), (11,'b')

select * from @tb

col1

col210a

11b10a

10a10a

10a10a

11b如果想更新或刪除上面資料中的某些行,那麼無法直接用where指定條件。

可以將資料臨時增加乙個需要列再處理。

其實不用額外處理資料,利用sql 內部資料儲存的實體地址也可以定位某行資料。

在sql server 2005裡可以通過%%lockres%%得到資料行對應的物理路徑資訊,在sql server2008裡還可以通過%%physloc%% 得到,用sys.fn_physlocformatter 將得到的binary資料轉換後就是%%lockres%% 的值。

注意上面的是 undocumented function,使用有風險,sys.fn_physlocformatter還有個bug

select

%%physloc%% as

addr,sys.fn_physlocformatter(%%physloc%%) as rowid , * from

@tb

addr

rowid

col1

col2

0x2008000003000000

(3:2080:0)10a

0x2008000003000100

(3:2080:1)11b

0x2008000003000200

(3:2080:2)10a

0x2008000003000300

(3:2080:3)10a

0x2008000003000400

(3:2080:4)10a

0x2008000003000500

(3:2080:5)10a

0x2008000003000600

(3:2080:6)10a

0x2008000003000700

(3:2080:7)11b

假設現在要求重複的資料僅留一行,那麼就可以利用位址來標識。

按如下執行後將僅餘兩行資料

delete t1 from

@tbas t1

inner

join (select col1,col2,max(%%physloc%%) as maxindex from

@tbgroup

by col1,col2) t2 on t1.col1=t2.col1 and t1.col2=t2.col2

where (t1.%%physloc%%)!=t2.maxindex

執行後:

select  * from @tb
col1

col210a

11b

oracle中update多行資料

a表aid,aname b表bid,bname 現在假設兩張表裡面的資料行數是相等的,現在要更新a表裡面的每一行的anmae,條件是依據b表裡面的bid 在sql server中好像可以這麼寫 update a set aname b.bname from a a,b b where a.aid b...

db2刪除完全相同的重複資料 什麼是重複資料刪除?

重複資料刪除 通常稱為重複資料刪除 是一項功能,可幫助降低冗餘資料對儲存成本的影響。啟用後,重複資料刪除會檢查卷上的資料 檢查是否存在重複分割槽 優化卷上的可用空間。卷資料集的重複分割槽只儲存一次,並可以壓縮,節省更多空間。重複資料刪除可優化冗餘,而不會損壞資料保真度或完整性。好處 節約硬碟空間 由...

Pandas中根據列的值選取多行資料

選取等於某些值的行記錄 用 df.loc df column name some value 選取某列是否是某一型別的數值 用 isin df.loc df column name isin some values 多種條件的選取 用 df.loc df column some value df o...