2015-08-31 23 views
0

的Oracle SQL:如何找到并删除重复的Oracle SQL:查找并删除重复(在不同的列值相同)

我只有只读访问Oracle(仅可以使用SELECT命令)。

逻辑:两个用户 'A' & 'B' 由具有相同公司名称&名字

列提取:

ID of A 
ID of B 
Company Name of A 
Company Name of B 
First Name of A 
First Name of B 

我使用以下查询:

select a.id, b.id, a.name, b.name, a.company, b.company from 
(select id, company, name where country = 'USA') a, 
(select id, company, name where country = 'UK') b 
where a.id <> b.id 
and lower(a.company) = lower(b.company) 
and a.username = b.username 

在这里我得到的每一行两次(请参见下表):

A_ID .......... B_ID .......... A_NAME .... ...... B_NAME .......... A_COMPANY .......... B_COMPANY

3592382 .... 1977967 .... Peter ...... ..........彼得................. ABC ..................... A.B.C.

1977967 .... 3592382 .... Peter ................ Peter ................. A.B.C. ..................... A.B.C.

5949363 .... 5941818 .... Joseph ............ Joseph .............. X.Y.Z. ........................ X.Y.Z.

5941818 .... 5949363 .... Joseph ............ Joseph .............. X.Y.Z. ........................ X.Y.Z.

+0

别的人都提到了一些任何有价值的数据你的语法错了,但我看到一个更基本的问题。为什么美国和英国公司在同名时会被认为是重复的? –

回答

0

你有几个问题与查询。

1)如果你做select val1,val2 from a, b,你会得到一个cross-join结果。

2)别名表没有from子句。

你说你只有select访问权限。因此你只能得到select的非重复值。

select distinct a.id, b.id, a.name, b.name, a.company, b.company 
from 
(select id, company, name from tablename where country = 'USA') a 
join 
(select id, company, name from tablename where country = 'UK') b 
on a.id = b.id and lower(a.company) = lower(b.company) and a.username = b.username 
0

您忘记了子查询中的表名。此外,我建议不要让a.col和b.col在双方的值将是相同的(这是)的条件,因为它降低性能并没有增加

SELECT a.id, b.id, a.name, a.company 
FROM tablename a 
JOIN tablename b 
    ON (a.name == b.name AND a.company == b.company AND a.username == b.username) 
WHERE a.country = 'USA' 
    AND b.country = 'UK' 
相关问题