SQL 两个字段去重

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 两个字段去重相关的知识,希望对你有一定的参考价值。

select o.name, substr(translate(translate(translate(pa.name,'','|'),'',X'0D'),'',X'0A'), 1, 254), \
translate(c2.fst_name,'','|'), \
translate(c2.last_name,'','|'), \
c2.email_addr, \
translate(coalesce(sao.country, 'NULL'),'','|'), \
translate(coalesce(sao.state, 'NULL'),'','|') \
from siebel.eim_opty eo \
join siebel.s_opty o on eo.t_opty__rid = o.row_id \
join siebel.s_postn p on o.pr_postn_id = p.row_id \
join siebel.s_org_ext a on o.pr_dept_ou_id = a.row_id \
left outer join siebel.s_org_ext pa on p.ou_id = pa.row_id \
left outer join siebel.s_addr_org sao on pa.pr_addr_id = sao.row_id \
left outer join siebel.s_postn p2 on p.ou_id = p2.ou_id \
left outer join siebel.s_contact c2 on p2.pr_emp_id = c2.row_id \
where o.x_opty_accept_stat = 'Pending Acceptance' and p2.x_bpoptyfoc_flg = 'Y' and p2.X_PR_BPOPTYFOC_FLG = 'N' and p2.row_id <> p.row_id \
and o.x_owning_org_id = pa.row_id \
and eo.if_row_batch_num between 104780000 and 104789999 \
and eo.if_row_stat in ('IMPORTED','PARTIALLY_IMPORTED','DUP_RECORD_EXISTS') \
and sao.country = 'JP' \
order by o.name,pa.ou_num with ur
这段SQL希望可以只获取o.name和 c2.email_addr唯一的结果 输出格式要和原来的一样
o.name和c2.email_addr都重复了才算作一条重复记录 单独o.name或者c2.email_addr重复不需要去掉

参考技术A 如果保证 o.name与c2.email_addr相同的其他表达式的值也相同,那就在select 后加上 distinct就可以了,distinct是剔除重复的记录,即每个字段或表达式的值都相同的只返回一条追问

其他值可能不同
基本就是
if(o.name重复&c2.email_addr重复) then
只取唯一一条

追答

这是oracle的?

追问

DB2的 跑在AIX上面给shell脚本用的

追答

由于不理解sql的业务含义及各表的关系,只能提一个思路了
with t as (select row_number over () rn, name, email_addr, f1, f2, f3 from ...)
// 这个t就是你的子查询
select * from t
where (rn, name, email_addr) in
(select min(rn), name, email_addr from t group by name, email_addr)
//这里的关键就是利用窗口函数给每一行赋一个行号,然后分组求得每一组的最小行号

参考技术B select distinct o.name, c2.email_addr  from t;
t是楼主查询结果,distinct会同时作用两个字段

参考技术C 有个关键字可用

distinct
select distinct name from user
查询不重复的名字追问

这个关键字好像就只能去重一个字段 我这边要去重两个字段~是and的关系o.name c2.email_addr都重复了才算作重复

追答

查询的时候把这两个字段连起来 这样就可以去重了 去重后在把它们分开
比如:select distinct name1+'_'+name2

拙见拙见

追问

我也很想这么做 但是这段输出要给之后的shell脚本用 所以不能改字段顺序~~~~

追答

可以来个外层的Sql查询  把它们分开就可以了

select substr(temp.name,) o.name,substr(temp.name,) c2.email_addr
 from (select distinct name1+'_'+name2 name) temp

记不清有啥好用的字符串分割函数了   可以用这个substr 先获取 _ 符号的位置

你试试可以不

本回答被提问者和网友采纳
参考技术D 加上distinct就可以实现去重复

union all ,union

union联合,如果想将两个select的结果一起显示出来就要考虑用联合。

两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致);

Union,     对两个结果集进行并集操作,去重,   同时进行默认规则的排序;

Union All,对两个结果集进行并集操作,不去重,不进行排序;

Intersect,对两个结果集进行交集操作,去重,   同时进行默认规则的排序;

Minus,     对两个结果集进行操作,  去重,   同时进行默认规则的排序。

可以在最后一个结果集中指定Order by子句改变排序方式。

union 和 union all都可以将多个结果集合并,而不仅仅是两个,你可以将多个结果集串起来。 
使用union和union all必须保证各个select 集合的结果有相同个数的列,并且每个列的类型是一样的。但列名则不一定需要相同,oracle会将第一个结果的列名作为结果集的列名。

 

以上是关于SQL 两个字段去重的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句对某字段去重?

SQL多个字段如何去重

两个字段都相同的记录如何去重

SQL语句怎么对单个字段去重,并且要显示所有列

SQL多个字段如何去重

sql只根据某一字段去重,并保留其他字段