2014-01-20 4 views
0

Предположим, у меня есть база данных с двумя столбцами, id (bigint) и текст (текст). Я хочу найти все строки в базе данных, у которых есть идентификатор, который встречается более чем в одной строке. Как я мог это сделать?Найти все строки, которые имеют значение в определенном столбце, который встречается более одного раза

Пример:

1; foo 
2; bar 
3; baz 
2; fubar 
4; blah 
3; bleh 

Желаемый результат:

2; bar 
2; fubar 
3; baz 
3; bleh 

Я совершенно новой для SQL. У меня есть мысль, что я хочу что-то вдоль линий

SELECT id,text FROM mytable ORDER BY id ASC; 

Но я понятия не имею, как устранить строки, где идентификатор уникален. Мне нужно по существу противоположность SELECT DISTINCT. Заранее спасибо!

+1

Насколько я знаю, я не думаю, что есть простой способ сделать это, без используя вложенные запросы. Вы пытались использовать «GROUP BY» и «HAVING» для отображения строк с дублирующимися идентификаторами? 'SELECT COUNT (*), id, text FROM my_Table GROUP BY id HAVING count (id)> 1' – Yani

ответ

4

Вы можете сделать это с оконными функциями:

select id, text 
from (select t.*, count(*) over (partition by id) as cnt 
     from table t 
    ) t 
where cnt > 1; 
+0

Здесь я должен быть именем моей таблицы? Я смущен насчет 't' за пределами закрытого пароля на третьей строке – PurpleVermont

+0

@PurpleVermont' t' в третьей строке - это имя подзапроса в круглых скобках. Вы можете изменить его на любое имя. Имя вашей таблицы переходит в 'from' часть вместо' table'. –

+0

А, спасибо, я был в замешательстве, так как это была та же переменная, что и имя таблицы внутри parens. Также я думаю, что 'FROM TABLE' ошибочно, и нам просто нужно' FROM', правильно? Почему в подзапросе нужно/получить имя, если оно никогда не упоминается? – PurpleVermont

1

Что-то вроде этого:

WITH more_than_one AS (SELECT id,count(*) FROM table1 GROUP BY id HAVING count(*) > 1) 
SELECT * FROM table1 JOIN more_than_one ON table1.id = more_than_one.id; 
+0

Спасибо! Я приближался к вашей статье AS, но я не думаю, что получил бы все это без вашей помощи. – PurpleVermont

+1

С помощью оконных функций запрос может быть выполнен с помощью одного сканирования. Ваш текущий запрос выполняет 2 сканирования и соединение. –

Смежные вопросы