首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -如何使用joins在同一个表(使用子查询)上执行交集?

SQL -如何使用joins在同一个表(使用子查询)上执行交集?
EN

Stack Overflow用户
提问于 2014-11-15 01:06:33
回答 1查看 470关注 0票数 0

我有两张桌子。车桌和租车桌。

汽车:

代码语言:javascript
复制
id brand
--------
0  honda
1  yota

租赁:

代码语言:javascript
复制
id id_car start end
--------
1  1      1     2
2  1      2     NULL

我需要执行两个查询。一个显示所有租来的汽车的窗口。另一个显示所有未租出的汽车。

第一个查询对我来说很简单。

代码语言:javascript
复制
SELECT car.id, car.brand, reg.start, reg.end
FROM car
LEFT JOIN car_registration AS reg ON car.id = reg.id_car
WHERE reg.end IS NULL

反向查询(用于确定租来的汽车)将涉及大致相反的内容。查找租赁列表,其中reg.id_car = car.idm,其中reg.end不为空。但是,如果在同一个表中存在reg.end为NULL的条目,那么汽车实际上是租来的。我需要将reg.end为NULL的租车列表和reg.end不为NULL的租车列表相交。

伪sql应该是这样的。

选择DISTINCT car.id (不返回重复的历史租赁),连接租车表,其中reg.end不为NULL。这将为我提供所有未租赁的汽车(过期租赁)。但是,我需要将其与reg.end为空的汽车租赁列表相交,以确定汽车实际上并未出租。

我知道SQL没有intersect语句。我知道joins在原理上是如何工作的,但这让我感到非常困惑。有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2014-11-15 02:49:50

您可以在单个查询中同时获得租赁和未租赁的汽车,只需将car表与您确定当前已出租的汽车的子选择连接起来即可。

代码语言:javascript
复制
SELECT
    c.id AS id,
    c.brand AS brand,
    r.rented AS rented
FROM
    (
        SELECT
            id,
            brand
        FROM car
    ) AS c
LEFT JOIN
    (
        SELECT DISTINCT
            id_car,
            1 AS rented
        FROM car_registration
        WHERE `end` IS NULL
    ) AS r
ON c.id = r.id_car

具有rented1的所有行都表示当前正在出租的汽车。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26935252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档