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重复不需要去掉
其他值可能不同
基本就是
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)
//这里的关键就是利用窗口函数给每一行赋一个行号,然后分组求得每一组的最小行号
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_addrfrom (select distinct name1+'_'+name2 name) temp
记不清有啥好用的字符串分割函数了 可以用这个substr 先获取 _ 符号的位置
你试试可以不
union all ,union
union联合,如果想将两个select的结果一起显示出来就要考虑用联合。
两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致);
Union, 对两个结果集进行并集操作,去重, 同时进行默认规则的排序;
Union All,对两个结果集进行并集操作,不去重,不进行排序;
Intersect,对两个结果集进行交集操作,去重, 同时进行默认规则的排序;
Minus, 对两个结果集进行差操作, 去重, 同时进行默认规则的排序。
可以在最后一个结果集中指定Order by子句改变排序方式。
union 和 union all都可以将多个结果集合并,而不仅仅是两个,你可以将多个结果集串起来。
使用union和union all必须保证各个select 集合的结果有相同个数的列,并且每个列的类型是一样的。但列名则不一定需要相同,oracle会将第一个结果的列名作为结果集的列名。
以上是关于SQL 两个字段去重的主要内容,如果未能解决你的问题,请参考以下文章