SQL:使用 MySQL 4 获取非耦合项列表

标签 sql mysql left-join outer-join

我不太擅长 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/

相关文章:

java - 如何通过 Hibernate 访问 Oracle DB 返回标识列的最大值?

php - MySQL动态条件按列的值?

php - 内存不足和允许的 * 字节内存大小之间的差异耗尽

sql - 从LEFT OUTER JOIN删除重复项

MySql - 列出所有用户并按登录用户排序

mysql - 选择排除同一列中 mysql 查询中特定值的字段

mysql - 使用数学运算符在 mysql 列上设置别名

PHP 弃用 : Methods with the same name as their class will not be constructors in a future version of PHP

mysql - 如果找到,SQL 将字段内容替换为另一个表中的内容

mysql - 选择请求选择5张表