2016-11-30 3 views
0

나는 더 많은 아파트를 소유 한 소유자의 이름을 찾으려면 EXISTS, IN, ALL, ANY와 같은 중첩 된 선택 연산자를 사용해야하는 프로젝트가 있습니다. 중첩 선택 쿼리를 변경하는 방법?

내가 2 개 테이블 소유자와 아파트 이상의 아파트가 주인을 찾기 위해

Owner 
"ID" NUMBER(5,0), 
"NAME" VARCHAR2(20), 
"PHONE" NUMBER(10,0), 
CONSTRAINT "PROPR" PRIMARY KEY ("ID") 
USING INDEX ENABLE; 

Apartment 
"ID_AP" NUMBER(5,0), 
"ADDRESS" VARCHAR2(35), 
"SURFACE" NUMBER(10,0), 
"ID" NUMBER(5,0), 
CONSTRAINT "APART" PRIMARY KEY ("ID_AP") 
USING INDEX ENABLE; 

을 가지고, 나는이

SELECT name, id, count(id) 
from apartment join owner 
using (id) 
group by id, name 
having count(id)>1 

을 썼다 그러나 어떻게 사용합니까 중첩 된 선택 및 운영자 중 하나 인 IN, ALL, ANY 중 하나? 이 같은 예를 들어

+0

이것은 mysql이 아닙니다. – e4c5

+1

먼저 join 대신 중첩 된 select를 사용해야하는 이유는 무엇입니까? – noodlesegg

답변

0

:

select * from owner where id IN (
    SELECT id 
    from apartment 
    group by id 
    having count(id)>1) 
0

나는 당신이 쓴 쿼리가 올바른지 확실히 모르겠습니다.

대신 수 (ID)의 (id_ap)를 계산 것입니다 제공하는 정확한 쿼리

SELECT o.id, o.name, count(a.id_ap) 
from apartment a 
join owner o on o.id = a.id 
group by o.id, o.name 
having count(a.id_ap)>1 

절에서 사용하는 동일한 쿼리하지만 아파트의 수없이, 당신은 단지 그것의 알고 2 개 이상

select o.id, o.name 
from owner o 
where o.id in (select distinct(a.id) from apartment a 
group by a.id having count(a.id_ap) > 1); 

소유자 테이블을 참조하는 아파트 테이블에도 외래 키 제약 조건이 없습니다.

0
WITH myView(name, id,appcount) 
as 
SELECT name, id, (select count(id) FROM apartment where id = ow.id) 
FROM owner ow 

SELECT * from myView 
WHERE appcount > 2 

WITH를 사용하여 인라인 뷰를 만들고 쿼리를 작성하는 데 사용하십시오. (select count (id) FROM apartment where id = ow.id) 외부 쿼리 선택시 아파트 수를 계산합니다.

관련 문제