SQL在第一列中返回重复项的内容,其中第二列中的值不同?

时间:2011-10-21 16:12:59

标签: sql oracle10g duplicates

问题与此find duplicates非常相似 但是我想找到代码不同于'ROME'的重复ID,并且至少有一个名称是'ROME'。

我想得到理想的结果,因为:

1.身份证复制。
2。至少有一个来源是'ROME'
3。该ID的剩余行不是'ROME'

Table 

ID   ORIGIN
-----------
1    ROME
1    ROME
2    ROME
2    LODI
3    ASTI
4    PISA
4    BARI

Desired Results
ID   ORIGIN
-----------
 2   ROME
 2   LODI 

4 个答案:

答案 0 :(得分:1)

SELECT
    id,
    origin
FROM
    My_Table T1
WHERE
    EXISTS (SELECT * FROM My_Table T2 WHERE T2.id = T1.id AND T2.origin = 'ROME') AND
    EXISTS (SELECT * FROM My_Table T3 WHERE T3.id = T1.id AND T3.origin <> 'ROME')

答案 1 :(得分:1)

SELECT t0.id, t0.origin FROM Table t0 WHERE t0.id IN
(SELECT distinct(t1.id) FROM Table t1 JOIN Table t2 ON t1.id = t2.id WHERE t1.id > 
(SELECT t2.id FROM Countries t2 WHERE t1.name = t2.name LIMIT 1));

输出

2罗马 2洛迪

这产生了您正在寻找的结果。我不确定它对于不同的数据集是否有任何错误。但这应该让你朝着正确的方向前进。

答案 2 :(得分:1)

SELECT id,
       origin
FROM (
    SELECT id, 
           origin, 
           count(*) over (partition by id) as id_count,
           count(case when origin = 'ROME' then origin else null end) over (partition by id) as rome_count,
           count(case when origin <> 'ROME' then origin else null end) over (partition by id) as non_rome_count,
           row_number() over (partition by id) as rn

    FROM stuff
) t
WHERE rome_count > 0 
  and non_rome_count > 0
  and id_count > 1

答案 3 :(得分:0)

CREATE GLOBAL TEMPORARY TABLE Test
(
    Id int,
    Origin varchar(100)
)

INSERT INTO #Test
SELECT  1,    'ROME' FROM DUAL UNION ALL
SELECT  1,    'ROME' FROM DUAL UNION ALL
SELECT  2,    'ROME' FROM DUAL UNION ALL
SELECT  2,    'LODI' FROM DUAL UNION ALL
SELECT  3,    'ASTI' FROM DUAL UNION ALL
SELECT  4,    'PISA' FROM DUAL UNION ALL
SELECT  4,    'BARI'

SELECT T.Id, T.Origin FROM #Test T
JOIN Test T2 ON T.Id = T2.Id
WHERE T.Origin = 'ROME' AND T2.Origin != 'ROME' OR T.Origin != 'ROME' AND T2.Origin = 'ROME'

有人在评论中询问是否可以更一般地写出来。它不能,否则我们不会得到正确的结果(PISA和BARI会在Table1.Origin!= Table2.Origin上跳过WHERE)