子查询麻烦

时间:2013-10-05 15:34:47

标签: sql

我有三张桌子需要我提供信息。我试图获得某些车辆的车牌号码,这些车辆的数量非常符合一些指导原则。

enter image description here

指导原则是:没有来自x市的客户预订的汽车。                     没有任何预订的汽车预订。

感谢我能得到的任何帮助。

SELECT DISTINCT f.licenseplateNo, Model FROM Car c
JOIN Booking b
ON  c.licenseplateNo = b.licenseplateNo
JOIN Customer c
ON c.customerID = b.customerID
WHERE c.Ort <> 'cityname'
ORDER BY licenseplateNo ASC

SELECT f.licenseplateNo, Model FROM Cars c
WHERE NOT EXISTS
(SELECT b.licenseplateNo FROM Booking b WHERE b.licenseplateNo = c.licenseplateNo);

此代码的问题显示为两个单独的问题。

1 个答案:

答案 0 :(得分:1)

没有来自x城市客户的任何预订的汽车

select *
from bookings b, customers c, cars ca
where b.licenseplateNo = ca.licenseplateNo
and c.CustomerID = b.CustomerID
where not c.city = x;

预订中没有任何预订的汽车。

select *
from cars c
where not exists (
  select b.licenseplateNo 
  from bookings b
  where b.licenseplateNo = c.licenseplateNo
);

您还可以使用汽车和预订之间的左外连接执行第二个查询,并检查是否为空。

没有任何预订的汽车预订,并且没有来自x市的客户的任何预订

将汽车从特定预订客户城市中排除的要求不包括该要求的子集,不包括所有预订的汽车。 因此tge第二个查询会处理这个问题,除非我们想要一个UNION的2个查询结果。

您可以执行两个查询的联合以获得组合结果。

另一个更好的选择是修改您的第一个查询以在汽车和预订之间使用左连接,并在您的位置添加或检查空。

SELECT DISTINCT f.licenseplateNo, Model
FROM Car c
LEFT JOIN Booking b
ON c.licenseplateNo = b.licenseplateNo
LEFT JOIN Customer c
ON c.customerID = b.customerID
WHERE c.Ort <> 'cityname'
OR c.Ort is NULL
ORDER BY licenseplateNo ASC;