我在这件事上陷入了困境,所以希望有人能帮忙。
我需要创建一个视图表并将两个表连接在一起,但我只需要显示缺少数据的条目。
因此,我有一张表列出了我拥有的无人机,包括制造商、序列号和购买日期,还有一张表列明了维护数据,包括每个设备的维护类型。该表还包括与第一个表类似的数据。
我需要从第一个表中提取设备数据,并将其与维护表进行比较,然后显示未接受特定类型维护的无人机。
这就是我尝试过的
CREATE VIEW uncommissioned AS
SELECT DISTINCT
drone.manufacturer AS manufacture,
drone.serial,
drone.type,
drone.purchase_date,
maintenance.type AS maintenance
FROM drone
INNER JOIN maintenance ON drone.type = maintenance.type
WHERE maintenance.type = 'NULL';
但这是一张空桌子,有什么建议可以告诉我哪里出了问题吗?
我认为您想要一个反LEFT JOIN
:
CREATE VIEW uncommissioned AS
SELECT DISTINCT
d.manufacturer AS manufacture,
d.serial,
d.type,
d.purchase_date,
d.type AS maintenance
FROM drone d
LEFT JOIN maintenance m ON d.type = m.type
WHERE m.type IS NULL;
注:
要检查零,您需要
IS NULL
构造(您的代码检查乱丢字符串'NULL'
):如果要显示维护类型,则需要从
drone
表中获取该信息,而不是从maintenance
表中获取
您也可以用NOT EXISTS
条件和相关子查询来表达这一点:
CREATE VIEW uncommissioned AS
SELECT DISTINCT
d.manufacturer AS manufacture,
d.serial,
d.type,
d.purchase_date,
d.type AS maintenance
FROM drone d
WHERE NOT EXISTS (SELECT 1 FROM maintenance m WHERE d.type = m.type)
IS NULL是正确的,right JOIN是因为在右表维护中为NULL
请尝试:SELECT DISTINCT drone.manufacturer AS manufacture, drone.serial, drone.type,
drone.purchase_date, maintenance.type AS maintenance
FROM drone RIGHT OUTER JOIN maintenance ON drone.type = maintenance.type
WHERE maintenance.type IS NULL;
基于您的最后一条评论:
循序渐进,建立你想做的事情(我们稍后将结合这些设置)。。。。
-
您正在查看所有无人机。因此,让我们从
drones
表中选择列,看看有什么。SELECT * FROM drones ;
manufacturer|serial|type|purchase_date:------------------------|----:|----:|:------------------洛克希德·马丁|1|1|2020-01-01 00:00:00空中机器人系统|2|10|2020-02-01 00:00:00亚马逊|3|100|2020-03-01 00:00:00诺斯鲁普·格鲁曼|4|2|2020-04-01 00:00:00DJI|5|20|2020-05-01 00:00:00泰坦航空|6|200|2020-06-01 00:00:00
-
maintenance
表中有什么?SELECT * FROM maintenance ;
dronetype|mxtype--------:|:----------------1|更换螺旋桨1|委托100|委托2|委托20 |委托200 |已禁用
-
这两张表是如何联系在一起的?让我们把它们钩在一起在CCD_ 11上具有CCD_。MOTE:我做了一个假设,并更改了
maintenance.type
,使其更能描述我认为这些关系应该如何。3.1.我们需要哪种
JOIN
?(举例说明:https://www.edureka.co/blog/sql-joins-types)。我只看INNER
和OUTER
JOIN
s。3.1.1
INNER JOIN
只会给我们在BOTH表中匹配的记录。SELECT d.manufacturer, d.serial, d.type, d.purchase_date, m.mxtype FROM drones d INNER JOIN maintenance m ON d.type = m.dronetype ;
manufacturer|serial|type|purchase_date|mxtype:---------------|----:|----:|:---------------|:----------------洛克希德·马丁|1|1|2020-01-01 00:00:00|更换螺旋桨洛克希德·马丁|1|1|2020-01-01 00:00:00|已调试亚马逊|3|100|2020-03-01 00:00:00|已委托诺斯鲁普·格鲁曼|4|2|2020-04-01 00:00:00|已调试DJI|5|20|2020-05-01 00:00:00|委托Titan Aerospace |6|200|2020-06-01 00:00:00|降级
这不是我们真正想要的。
3.1.2
OUTER JOIN
将为我们提供其中一个表的记录以及另一个表中匹配的行。不匹配的行将为NULL
。SELECT d.manufacturer, d.serial, d.type, d.purchase_date, m.mxtype FROM drones d LEFT OUTER JOIN maintenance m ON d.type = m.dronetype ;
manufacturer|serial|type|purchase_date|mxtype:------------------|----:|----:|:------------------|:----------------洛克希德·马丁|1|1|2020-01-01 00:00:00|更换螺旋桨洛克希德·马丁|1|1|2020-01-01 00:00:00|已调试亚马逊|3|100|2020-03-01 00:00:00|已委托诺斯鲁普·格鲁曼|4|2|2020-04-01 00:00:00|已调试DJI|5|20|2020-05-01 00:00:00|委托泰坦航空|6|200|2020-06-01 00:00:00|已退役空中机器人系统|2|10|2020-02-01 00:00:00|空
That shows us all of the `drones` with a `NULL` record for the non-matched one.
-
但我们想在
maintenance
表格中显示尚未使用Commissioned
的无人机。SELECT d.manufacturer, d.serial, d.type, d.purchase_date, m.mxtype FROM drones d LEFT OUTER JOIN maintenance m ON d.type = m.dronetype WHERE m.mxtype <> 'commissioned' ;
manufacturer|serial|type|purchase_date|mxtype:---------------|----:|----:|:---------------|:----------------洛克希德·马丁|1|1|2020-01-01 00:00:00|更换螺旋桨Titan Aerospace |6|200|2020-06-01 00:00:00|DECOMISIONED
但现在我们错过了无与伦比的记录,我们正在显示我们不想要的记录(比如
Lockheed Martin
记录,它有两个maintenance
记录,其中一个是Commissioned
)。 -
因此,让我们从
drones
表中选择在maintenance
中没有Commissioned
记录的记录。我们可以用NOT EXISTS
来做到这一点。SELECT d.manufacturer, d.serial, d.type, d.purchase_date FROM drones d WHERE NOT EXISTS ( SELECT 1 /* This can be anything. It's ignored. */ FROM maintenance m WHERE m.mxtype = 'commissioned' AND m.dronetype = d.type ) ;
manufacturer|serial|type|purchase_date:------------------------|----:|----:|:------------------空中机器人系统|2|10|2020-02-01 00:00:00泰坦航空|6|200|2020-06-01 00:00:00
现在我们有两架无人机,它们在
maintenance
中没有Commissioned
的记录。注意:在这个最终查询中,我们使用了一个相关的子查询来将
maintenance
表链接到drones
表,并且我们在maintenance
表的查询中包含了一个条件,以仅选择具有mxtype
或commissioned
的记录。并且WHERE NOT EXISTS
将过滤drones
表的查询以排除子查询中DO匹配的任何行
您可以在这里玩查询和数据:db<>小提琴