Как выбрать уникальные и дублированные строки исключить с разными значениями

Как я могу получить эту таблицу, как ожидалось в Oracle. Я пытаюсь сделать это, как показано ниже, но это не дает мне правильный результат. Я ожидаю получить только уникальные и исключить, если это запись с разными значениями. Извините, если спросили раньше, но я не смог найти его.

SELECT * 
FROM ...
WHERE number IN ( SELECT name
                  FROM (SELECT *
                        FROM table
                        WHERE number IN ('Mel','Jose','Kim')
                  ) ds
                  GROUP BY number
                  HAVING COUNT (*) = 1)

Текущий результат:

 number name
   aaa   Mel
   asd   Jose
   fsa   Jose
   xdf   Jose
   zzz   Kim
   zzz   Kim

Ожидаемый результат:

aaa Mel
zzz Kim

2 ответа

Решение

Вы близки - я думаю, что вы просто упустили отличное в подсчете в вашем предложении.

Например:

WITH your_table AS (SELECT 100 nmbr, 'Mel' NAME FROM dual UNION ALL
                    SELECT 112 nmbr, 'Jose' NAME FROM dual UNION ALL
                    SELECT 212 nmbr, 'Jose' NAME FROM dual UNION ALL
                    SELECT 313 nmbr, 'Jose' NAME FROM dual UNION ALL
                    SELECT 101 nmbr, 'Kim' NAME FROM dual UNION ALL
                    SELECT 101 nmbr, 'Kim' NAME FROM dual)
-- end of mimicking data in your table
-- you already have this table, so you would just need the below sql:
SELECT min(nmbr) nmbr,
       NAME
FROM   your_table
GROUP BY NAME
HAVING COUNT(DISTINCT nmbr) = 1;

      NMBR NAME
---------- ----
       101 Kim
       100 Mel

Просто чтобы доказать, что не имеет значения, имеет ли столбец nmbr тип данных NUMBER или VARCHAR2:

WITH your_table AS (SELECT 'aaa' nmbr, 'Mel' NAME FROM dual UNION ALL
                    SELECT 'asd' nmbr, 'Jose' NAME FROM dual UNION ALL
                    SELECT 'fsa' nmbr, 'Jose' NAME FROM dual UNION ALL
                    SELECT 'xfd' nmbr, 'Jose' NAME FROM dual UNION ALL
                    SELECT 'zzz' nmbr, 'Kim' NAME FROM dual UNION ALL
                    SELECT 'zzz' nmbr, 'Kim' NAME FROM dual)
-- end of mimicking data in your table
-- you already have this table, so you would just need the below sql:
SELECT min(nmbr) nmbr,
       NAME
FROM   your_table
GROUP BY NAME
HAVING COUNT(DISTINCT nmbr) = 1;

NMBR NAME
---- ----
zzz  Kim
aaa  Mel

Вы можете сделать nested sql с the inner part устранить повторяющиеся по отношению к id & name, И в the outer part устранить повторяющиеся только name как в следующем заявлении:

SELECT MAX(id),name 
FROM (SELECT id,name FROM mytable GROUP BY id, name)  
GROUP BY name 
HAVING COUNT(1) = 1
ORDER BY MAX(id);

ВЫХОД:

ID       NAME
-----    ------
100      Mel
101      Kim

D эмо 1

точно такой же sql работает для вашего второго случая:

D эмо 2

Другие вопросы по тегам