SQL Distinct處理多列的問題

2022-07-20 06:12:10 字數 1444 閱讀 8999

今天在做ssis的etl工作時,其中乙個left join元件的執行結果總是會多出一些記錄。分析了一下,該問題的原因是右表中作為關聯的那一列資料有重複。left join的執行策略可以理解為根據左表的每一條記錄的關聯欄位去對照右表的關聯字段,如果右表的關聯字段存在重複,就會生成重複的記錄。如果左表存在重複而右表無重複,則不會多出來記錄。舉個例子,如果左表a和右表b的資料分別如下所示

a表id

name1張三

2李四3王五

4王陸b表id

description

1內聯部

1系學生會

2外聯部3團委

這時如果用id作為關聯欄位用a表left join b表,結果會產生5條記錄,比左表多一條。(順便提一下,如果右表不重複,則left join的結果數會與左表相等)

a表left join b表結果

idname

description1張三

內聯部1

張三系學生會2李四

外聯部3

王五團委4王陸

null

實際上,我想要的結果是與左表a一一對應,不要有重複的記錄。這可以通過ssis的lookup元件實現,但是效率會很低。因此就想到把右表中的重覆記錄去除掉再join兩張表。首先自然地想到用distinct函式去重

select

distinct

id, description

from b

結果卻是1條記錄都沒去掉,因為distinct是作用於多列的,也就是說必須要id和description全都相同的才會被剔除。

在網上搜了一下,有人說用 select *, count(distinct name) from table group by name  這樣的語句是可行的,但我在sql server裡面試了一下會報錯。只好自己動手,豐衣足食啦,想了一下,其實可以用下面的語句

select

id,  

max(description) as

description

from b

group

by id

進一步的思考後發現,sql server中有first_value和last_value函式,也可以實現

select

distinct

id, first_value(description)

over (partition

by id

order

by description) as

description

from b

第二種方法中partition by的引數必須是id,order by的引數可以調整,這就使得該方法更加靈活。這兩種方法經實測效率差不多,第一種稍微快一點點。不過遺憾的是ssis中不支援第二種方法,只能用第一種group by的方式。

sql distinct 多列問題

查詢單列,使用select distinct name from photos 是沒有問題的。但若想查詢多列,如select distinct name,nickname,department from photos 是將三列完全相同的內容過濾掉,但凡三列有一列不同,均會列出來。若將distinct...

批處理處理多列文字

批處理處理多列文字,注意特殊字元右括號前有 號。tokens的寫法網上的版本大多有問題,下面是實測通過的版本 rem construct the sql statements of 009 dbc.constantdefs if exist constantdefs.out for f tokens...

sql DISTINCT 關鍵字去掉重複的列

distinct關鍵字主要用來從select語句的結果集中去掉重複的記錄。如果使用者沒有指定distinct關鍵字,那麼系統將返回所有符合條件的記錄組成結果集,其中包括重複的記錄。記錄一下工作中用到的sql語句吧,下面sql實現了去掉重複列id後顯示的資料。select distinct u.id,...