2012-08-23 3 views
-1

저는 Car와 CarBorrowed라는 두 개의 테이블을 가지고 있습니다.SQL 오라클은 모든 멤버가 빌린 그룹을 선택합니다.

자동차 테이블에는 자동차 풀에있는 모든 차량과 자동차가 속한 그룹이 포함되어 있습니다. 예를 들어 :

ID 1, Car 1, Group Renault 
ID 2, Car 3, Group Renault 
ID 3, Car 4, Group VW 
ID 4, Car 6, Group BMW 
ID 5, Car 7, Group BMW 

CarBorrow 표는 특정 날짜에 빌린 모든 자동차를 포함

지금은 더 차가 남아 있지 모든 그룹, 원하는
Car 1, Borrowed on 23.08.2012 
Car 3, Borrowed on 23.08.2012 
Car 5, Borrowed on 23.08.2012 

(오늘 = 2012년 8월 23일) . 그래서 "Group Renault"를 받아야합니다.

+2

적어도 해봤습니까? 사람들은 이런 유형의 질문에 대답해서는 안됩니다. – davidmontoyago

+0

예 나는 오후 내내 노력했지만 어떤 차가 남아 있지 않은 그룹을 얻는 지 전혀 몰랐다. 나는 자동차가있는 모든 그룹 만 갖고있다. –

답변

1

흠. . . "그룹은"그런데

select borrowed.BorrowedOn, available.CarGroup 
from (select c.CarGroup, count(*) as cnt 
     from car c 
     group by c.CarGroup 
    ) available left outer join 
    (select c.CarGroup, cb.BorrowedOn, count(*) as cnt 
     from CarBorrowed cb join 
      Car c 
      on cb.CarId = c.CarId 
     group by c.CarGroup, cb.BorrowedOn 
    ) borrowed 
    on available.CarGroup = borrowed.CarGroup 
where available.cnt = borrowed.cnt 

:이 쿼리를 접근하는 한 가지 방법은 그룹의 차를 계산하고 또한 특정 일에 차를 계산 한 후 빌린 그룹을 걸릴 것입니다 가능한 동일 SQL 예약어이기 때문에 열의 나쁜 이름. CarGroup으로 이름을 바꿨습니다.

주어진 날에 같은 차를 두 번 이상 빌릴 수 있다면 두 번째 하위 쿼리의 count(*)count(distinct cb.carId)으로 변경하십시오.

하루 만 있으면 WHERE 절에 절을 추가 할 수 있습니다.

+0

자동차를 하루에 두 번 빌리면 잘못된 결과가 나옵니다. –

+0

@FlorinGhita. . . 그것이 유효한 포인트입니다. 나는 타임 스탬프없이, 나는 차를 하루에 두 번 빌릴 수 없다는 가정을했다. 더 큰 문제는 시간이 지남에 따라 자동차 풀이 변경 될 수 있기 때문에 해당 테이블에도 날짜 스탬프가 있어야한다는 것입니다. –

+0

이것은 좋은 것처럼 보이지만 실행하면 다음 오류가 발생합니다. 00918. 00000 - "애매하게 정의 된 열" –

1

먼저 테이블을 가입하십시오. 그래서 우리는 모든 차를 빌려줍니다 (하루).

select c.id, c.GroupName, cb.day 
from car c 
left join (select * from CarBorrow where day = '23 Aug 2012') cb 
    on (c.id = cb.id) 

차가 빌려 가지 않은 자동차는 모두 하루 동안 null이됩니다.

그런 다음 null이없는 모든 그룹을 선택합니다. 트릭 울부 짖는 소리를 얻을 수 있습니다 :

select GroupName 
FROM(
    select c.id, c.GroupName, cb.day 
    from car c 
    left join (select * from CarBorrow where day = '23 Aug 2012') cb 
     on (c.id = cb.id) 
) 
group by GroupName 
having count(day) = count(*) 

(null 인 일이 COUNT에 의해 계산되지 않습니다)

1
SELECT distinct(D1.CARGROUP) 
FROM den_car d1 
MINUS 
(SELECT D.CARGROUP 
FROM den_car d 
WHERE d.id IN (SELECT c.ID 
       FROM den_car c 
       MINUS 
       SELECT b.id 
       FROM den_car_borrow b 
       WHERE B.DATE_BORROW = TO_DATE (SYSDATE))) 

이 최적화 될 수 있지만 아이디어는 간단하다 : 빌린 사람을 찾아, 그것을 빼기 모든 차에서. 그런 다음 잔존하는 그룹을 찾으십시오.

희망이 있습니다. (물론 그런데 그것을 할 수있는 다른 방법이 많이있다.)

0

내가 지금 해결책이 있다고 생각 : 당신의 도움에 대한

select x.groupname from 
(select a.groupname, count(*) as cnt from car a group by a.groupname) x 
inner join 
(
    select b.groupname, count(*) as cnt from car b where b.carid in (select caraid from modavail where day ='23.08.2012') 
    group by b.groupname 
) y 

on x.groupname = y.groupname 
where x.cnt = y.cnt and y.cnt ! = 0 ORDER BY GROUPNAME; 

감사합니다 !!!!

관련 문제