我不太擅长 SQL,并且遇到了一个不知道如何解决的问题。我已经阅读并重新阅读了一本有关 SQL 的书(O'Reilly 的《学习 SQL》)的部分内容,我希望这本书包含我需要的信息,但我还没有找到。
我的问题如下。我将使用一个简化的示例来方便讨论。
我有三个表:car、rim 以及两者的组合:carRim。
car
carId
description
rim
rimId
description
carRim
carRimId
carId
rimId
price
在表 carRim 中,我有一个额外的价格属性,因为每种类型的汽车的轮辋价格可能不同。我的一个限制是每种类型的轮辋只能与每种类型的汽车连接一次。因此,所有车圈组合都应该是独一无二的。
如果我想为汽车添加轮辋,我需要一份尚未与该汽车连接的轮辋列表。为此,我认为我需要分别使用 rim 表和 carRim 表来获取已与我想要添加轮辋的汽车耦合的轮辋总列表和 carRim 列表。
我编写了(简单)查询来生成与特定汽车耦合的轮辋列表,在以下示例中为 carId 9 的汽车。
SELECT
*
FROM
rims
INNER JOIN
carRims
ON
carRims.rimId = rim.rimId
WHERE
carRims.carId = 9
但现在我需要尚未与特定汽车耦合的轮辋列表。问题是,如果我执行 LEFT OUTER JOIN,我得到的列表会被轮辋与其他汽车的耦合“污染”,因此“WHERE carRims.carId IS NULL”的过滤条件不起作用。
SELECT
*
FROM
rims
LEFT OUTER JOIN
carRims
ON
carRims.rimId = rim.rimId
WHERE
carRims.carId IS NULL
另一个挑战是我无法使用 MySQL 5 中的任何新语法,例如子查询,因为我的客户端正在使用 MySQL 4 并且目前无法升级。
这个问题的查询可以在MySQL 4中编写吗,我怀疑可以。
谢谢!
最佳答案
SELECT *
FROM rims r
WHERE NOT EXISTS
(
SELECT NULL
FROM carRims cr
WHERE cr.rimId = r.RimId
AND cr.carID = 9
)
更新:
要将 NOT EXISTS
重写为 LEFT JOIN/IS NULL
,您需要将所有条件放入 ON
子句中连接:
SELECT r.*
FROM rims r
LEFT OUTER JOIN
carRims cr
ON cr.rimId = r.rimId
AND cr.crID = 9
WHERE cr.carId IS NULL
关于SQL:使用 MySQL 4 获取非耦合项列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2133230/