-1

CarとCarBorrowedの2つのテーブルがあります。

のテーブルには、車が属するIDとグループを持つ車のプール内のすべての車が含まれます。例えば:

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

今、私は車が残っていないすべてのグループが欲しいです(今日= 23.08.2012)。だから私は「グループルノー」を手に入れるべきです

4

4 に答える 4

1

まず、テーブルを結合して、すべての車の借り入れ (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 を持たないすべてのグループを選択する必要があります。それを取得するためのトリックを以下に示します。

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 でカウントされません)

于 2012-08-23T13:47:17.513 に答える
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)))

これは最適化されているかもしれませんが、アイデアは単純です: 借りたものを見つけて、すべての車から差し引きます。次に、残りのグループを見つけます。

それが役に立てば幸い。(ちなみに、他にもたくさんの方法があります。)

于 2012-08-23T13:55:45.250 に答える
1

うーん。. . このクエリにアプローチする 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(*)、2 番目のサブクエリの を に変更しcount(distinct cb.carId)ます。

1 日だけが必要な場合は、WHERE 句に句を追加できます。

于 2012-08-23T13:40:07.803 に答える
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;

ご協力いただきありがとうございます!!!!

于 2012-08-24T14:09:21.427 に答える