我想选择所有不属于某个公司的飞机。在这种情况下,我有三个表:Planes
,Companies
和CompanyPlanes
。
这是我的问题:
SELECT *
FROM planes p,
companyplanes cp,
companies c
WHERE c.id = ?
AND cp.idCompany != c.id
AND (cp.idPlane = p.id OR p.id NOT IN (SELECT idPlane FROM companyplanes))
ORDER BY name ASC
但是这个查询什么都没有回复!这有什么不对?
示例:
| Plane |
---------
id | name
---------
1 | p1
2 | p2
3 | p3
|Company|
---------
id | name
---------
1 | c1
2 | c2
| companyPlanes |
------------------------
id | idCompany | idPlane
------------------------
1 | 1 | 1
2 | 1 | 2
3 | 2 | 2
如果我想获得不属于公司c2
的飞机,结果应为:p1,p3。
答案 0 :(得分:1)
更新答案
我们可以按照以下方式获得结果
获取意外公司的所有飞机
SELECT idplane from CompanyPlanes
WHERE idCompany = ?
在没有意外公司的飞机的情况下获取所有飞机
SELECT * FROM Planes
WHERE id NOT IN
(
SELECT idplane from CompanyPlanes
WHERE idCompany = ?
)
由于您已从join
表中获得Company
,因此您无需idCompany
CompanyPlanes
表。
答案 1 :(得分:0)
内连接要求查询从公司平面中具有相应行的平面返回行,但子选择将排除在公司平面中具有相应记录的任何行。
假设您想要公司平面上没有记录的飞机记录,那么您为什么还要从公司中选择?
Select p.*
From planes p
Left join
Companyplanes do
On p.id=cp.idplane
Where cp.idplane is null;
答案 2 :(得分:0)
如果我以正确的方式理解你的问题,这就是你可能正在寻找的......
select p.*
from planes p
join companyplanes cp on cp.idPlane=p.id
join companies c on c.id=cp.idCompany
where c.id != ?