2013-04-16 3 views
4

두 테이블 사이에 조인을하고 조건을 추가하면 조인 조건과 "extern"조건을 만족하는 첫 번째 행만 가져 오려고합니다. 예를 들어조건을 만족하는 첫 번째 행만 선택하는 방법은 무엇입니까?

이 쿼리 : 모든

select * from PRMPROFILE p, user v 
where 
p.id = v.profile 
and p.language = 0 
and v.userid like '%TEST%'; 

첫째, 나는이 내부의 결과가 프로파일 (v.profile 또는 p.id)를 사용하여 조인 방법 그룹 알고 싶어요. 그 후 각 그룹에 첫 번째 모습 만 표시하는 방법.

미리 감사드립니다.

+0

몇 가지 샘플 데이터와 예상되는 결과를 보여줄 수 있습니까? 그리고 특정 행을 '첫 번째'일치로 만드는 것을 정의해야합니다. –

+1

"extern"상태 란 무엇을 의미합니까? 'ROWNUM = 1' ([오라클 문서 참조] (http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm))을 사용해 보셨습니까? 부록 : 일치하는 결과가 하나 뿐이지 만 쿼리간에 일관성이 없을 수 있습니다. [ROWID] (http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns008.htm)도 참조하십시오. – wmorrison365

+0

"extern"조건은 결합 조건과 다른 조건입니다. 조인은 명시 적이지 않으며 where 절에서 일부 조건이 필요합니다. –

답변

6

당신은이에 대한 분석 쿼리를 사용할 수 있습니다

select * 
from (
    select p.*, v.*, 
     row_number() over (partition by p.id order by v.userid) as rn 
    from prmprofile p 
    join user v on v.profile = p.id 
    where p.language = 0 
    and v.userid like '%TEST%' 
) 
where rn = 1; 

내부 쿼리 모두를 얻을 수 데이터를 사용하지만 (*을 사용하는 것은 이상적이지 않습니다), e에 걸쳐 행 번호 시퀀스를 지정하는 추가 열을 추가합니다 ach p.id 값입니다. 그들은 뭔가에 의해 명령을 받아야하고, 어떤 행을 '처음'으로 만들지는 말하지 않았으므로 사용자 ID로 추측했습니다. 물론 더 적절한 것으로 변경하면 일관성있는 결과를 얻을 수 있습니다. 쿼리가 다시 실행됩니다. ('첫 번째'행을 선택하는 다른 방법은 rankdense_rank을 참조하십시오).

외부 쿼리는 추가 열의 값이 1 인 결과 집합을 제한하기 만하면 p.id에 대해 하나의 행이 제공됩니다.

또 다른 접근법은 '첫 번째'행을 식별하고 이에 결합하는 하위 쿼리를 사용하는 것이지만 기준이 무엇이고 명확한 선택인지는 분명하지 않습니다.

+0

나를 위해 작동하지 않습니다. Throws me "열이 모호하게 정의 됨" –

+1

@ JorgeVegaSánchez -'profile'과'user' 테이블에 같은 이름의 열이 있습니까? 그렇다면'*'를 사용하는 대신 명시 적으로 모든 것을 나열해야하고, 별칭이 다른 이름으로 표시되도록 복제 별칭을 지정해야합니다 (실제로 둘 다 검색하려고한다고 가정). –

+0

같은 이름의 열이 없습니다.나는 어떤 문제도없이 참여를 할 수있다. prmprofile p 에서 사용자 v에 v.profil = p.id 여기서 p.langue = 0 및 v.userid와 같이 '% TEST %';를 선택한다. –

0

그것은

select top 1 * from PRMPROFILE p, user v 
where 
    p.id = v.profile 
    and p.language = 0 
    and v.userid like '%TEST%'; 
+3

오라클에는 해당 구문이 있습니까? – Thilo

+0

죄송합니다. 나는 그것을 SQL에 준 – user1613212

2

시도하십시오 상단에만 결과를 표시합니다 :

select * from(
    select *, 
    row_number() over (partition by v.userid order by v.userid) RNum 
    from PRMPROFILE p, user v 
    where 
    p.id = v.profile 
    and p.language = 0 
    and v.userid like '%TEST%' 
)x 
where RNum=1; 
+0

그러나 각 그룹의 첫 번째 모양 만 표시하도록 결과 조인 테이블을 그룹화하지는 않습니다. –

+0

'group' 열은 어느 것입니까? – TechDo

+0

v.profil 또는 p.id는 부스 테이블을 연결하는 데 사용되는 열입니다. –

1

LIMIT 키워드를 사용할 수 있습니다.

select * from PRMPROFILE p, user v 
where 
p.id = v.profile 
and p.language = 0 
and v.userid like '%TEST%' 
limit 1 
+2

오라클은'LIMIT'을 가지고 있지 않습니다 (분명히 12c까지). 또한 질문의 '그룹화'부분을 다루지 않을 것입니다. OP는 전체 쿼리에 대해 단일 행이 아닌 프로필 ID 당 하나의 행을 원합니다. –

관련 문제