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)
//这里的关键就是利用窗口函数给每一行赋一个行号,然后分组求得每一组的最小行号
这个关键字好像就只能去重一个字段 我这边要去重两个字段~是and的关系o.name c2.email_addr都重复了才算作重复
追答查询的时候把这两个字段连起来 这样就可以去重了 去重后在把它们分开
比如:select distinct name1+'_'+name2
拙见拙见
我也很想这么做 但是这段输出要给之后的shell脚本用 所以不能改字段顺序~~~~
追答可以来个外层的Sql查询 把它们分开就可以了
select substr(temp.name,) o.name,substr(temp.name,) c2.email_addr记不清有啥好用的字符串分割函数了 可以用这个substr 先获取 _ 符号的位置
你试试可以不