2014-01-20 4 views
0

id (bigint)와 text (text)의 두 열이있는 데이터베이스가 있다고 가정합니다. 하나 이상의 행에서 발생하는 ID를 가진 데이터베이스의 모든 행을 찾고 싶습니다. 내가 어떻게 할 수 있니?두 번 이상 나타나는 특정 열에 값이있는 모든 행을 찾습니다.

예 :

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; 

그러나 id가 고유 한 행을 제거하는 방법을 모른다. 본질적으로 SELECT DISTINCT의 반대가 필요합니다. 미리 감사드립니다! 이 같은

+1

지금까지 내가, 내가 그 일을하는 간단한 방법이없이,이 생각하지 않는다 알고 중첩 된 쿼리를 사용합니다. 중복 ID가있는 행을 표시하려면 'GROUP BY'및 'HAVING'을 사용해 보셨습니까? '(*), ID, 텍스트 my_TABLE에서 SELECT 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'는 괄호 안의 하위 쿼리의 이름입니다. 이름을 변경할 수 있습니다. 테이블의 이름은'table' 대신'from' 부분으로갑니다. –

+0

아, 감사합니다. 괄호 안의 테이블 이름과 같은 변수이기 때문에 혼란 스러웠습니다. 또한'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 회의 스캔과 조인을 수행합니다. –

관련 문제