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重复不需要去掉

第1个回答  2013-09-24
如果保证 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)
//这里的关键就是利用窗口函数给每一行赋一个行号,然后分组求得每一组的最小行号

第2个回答  2013-09-24
select distinct o.name, c2.email_addr  from t;
t是楼主查询结果,distinct会同时作用两个字段

第3个回答  2013-09-24
有个关键字可用

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 先获取 _ 符号的位置

你试试可以不

本回答被提问者和网友采纳
第4个回答  2013-09-24
加上distinct就可以实现去重复