-1

我有两张桌子:Car 和 CarBorrowed。

Car表包含拼车中所有具有 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

嗯。. . 处理此查询的一种方法是计算一个组中的汽车数量,并计算特定日期的汽车数量,然后选取借用量等于可用量的组:

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 子句中添加一个子句。

于 2012-08-23T13:40:07.803 回答
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)

所有未借用的汽车将在当天为空。

在此之后,我们应该选择所有没有空值的组。下面是一个技巧来获得它:

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 回答
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 回答