2011-10-28 7 views
2

ORACLE에 하나의 select 쿼리를 작성하여 조건이있는 모든 값이 제공된 경우에만 레코드를 반환합니다. 예 :조건에 모든 필수 값이있는 Oracle sql 쿼리

select * from emp where empid in (7521,7566,7698) 

이제 모든 3 개의 empid가있을 때만 값을 반환하도록이 쿼리를 작성하고 싶습니다. 그것은 AND 조건, 즉 empid = 7521 및 empid = 7566 및 empid = 7698과 같습니다. 하나의 값이 존재하지 않으면이 쿼리는 어떤 행도 가져 오지 않아야합니다.

+0

http : // stackoverflow를 확인한다. INST 문에서 사용할 수있는 값 목록으로 값 목록을 변환하는 방법은 com/q/4672545/55922를 참조하십시오. 거기에서, 당신이 그들 모두를 가지고 있는지 확인하기 위해 a_horse_with_no_name에 의해 제안 된 값을 계산하기 위해 분석 함수를 사용하고 길이 (id_list)를 사용하여 찾을 수있는 목록의 항목 수와 일치하는지 확인하는 것이 좋습니다 - 길이 대체 (id_list, ',')) + 1 – Craig

답변

3

한 번만 ID를 써야하는 Lukas 버전 :

with emp_ids as (
    select 7521 as eid from dual 
    union all 
    select 7566 from dual 
    union all 
    select 7698 from dual 
) 
select * 
from (
    select emp.*, 
     count(*) over() as cnt 
    from emp_new emp 
    where empid in (select eid from emp_ids) 
) 
where cnt = (select count(*) from emp_ids); 

이러한 경우 나는 항상 다른 DBMS에서 사용할 수있는 표준 행 생성자를 놓친다. 나는 어디에서든지 DUAL을 사용할 필요없이 원하는 값을 가진 가상 테이블을 생성하기 위해 VALUES (7521), (7566), (7698)을 쓸 수있다. ...

+0

여기에 몇 가지 복잡한 점이 있습니다. 즉, emp_ids에서 검색하는 eid에는 부모가 있으므로 내 수가 증가 할 것입니다. – user1017936

+0

그건 당신이 당신의 질문이나 루카스의 대답에 대한 귀하의 의견에 묘사 한 것이 아닙니다. (그리고 나는 "* * 부모가 있습니다.") –

+0

좋은 해결책입니다. Ad-hoc 인 메모리 테이블을 구성하기위한 CTE를 생각하지 않았습니다. 사실 오라클에서는 기본 'TABLE'또는 'VARRAY'유형이 없습니다 ... –

4

선별 중첩으로, 다시 같은 쿼리를 실행하고 계산의 기록 또는

select * from emp 
where empid in (7521, 7566, 7698) 
and 3 = (select count(*) from emp where empid in (7521, 7566, 7698)) 

원래 결과에 분석 함수를 사용하고 확인 : 연장

select * from (
    select emp.*, count(*) over() as cnt 
    from emp where empid in (7521, 7566, 7698) 
) 
where cnt = 3 
+0

하지만 여기서 내 상태는 동적입니다. 3으로 고정되어 있지 않습니다. – user1017936

+0

@ user1017936 : 저는 동적으로 렌더링 할 수 있다고 생각합니까? 관련 ID는 어디에 저장합니까? –

+0

사실 그것은 일부 검색 조건에 사용됩니다. 그래, 내가 계산할 수 있지만 다시 한 가지 문제가 사용자가 쉼표로 구분 된 값으로 문자열에 값을 입력하므로 IN 쿼리를 사용할 수 없습니다. – user1017936