我正在为此纠缠不清,所以希望有人可以提供帮助。
我需要创建一个视图表并将2个表连接在一起,但是我只需要显示缺少数据的条目即可。
因此,我有一个表,列出了我拥有的无人机,包括制造商,序列号和购买日期,还有另一个表,列出了维护数据,包括每台设备收到的维护类型。该表还包含与第一个表相似的数据。
我需要从第一个表中提取设备数据,并将其与维护表进行比较,并显示未收到特定维护类型的无人机。
这是我尝试过的
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';
但是这给出了一个空表,关于我要去哪里的任何建议?
答案 0 :(得分:1)
我认为您想要一个反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)
答案 1 :(得分:0)
IS NULL是正确的,而RIGHT JOIN是因为右表维护中的NULL
试试看:
type KeyType = 'string' | 'number'
type ValueType = { string: string, number: number }
type TestObject<T extends KeyType> = {
key: T
args: ValueType[T]
}
const test1: TestObject = { key: 'string', value: 'hello' } // should be ok
const test2: TestObject = { key: 'number', value: 2 } // should be ok
const test3: TestObject = { key: 'string', value: 2 } // should fail, value should be string
答案 2 :(得分:0)
根据您的最新评论:
逐步进行并建立您想做的事情(我们稍后将结合使用这些集合)....
您想签出所有无人机。因此,让我们从drones
表中选择列以查看其中的内容。
SELECT * FROM drones ;
manufacturer | serial | type | purchase_date :--------------------- | -----: | ---: | :------------------ Lockheed Martin | 1 | 1 | 2020-01-01 00:00:00 Aerial Robotic Systems | 2 | 10 | 2020-02-01 00:00:00 Amazon | 3 | 100 | 2020-03-01 00:00:00 Northrup Grumman | 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
maintenance
表中有什么?
SELECT * FROM maintenance ;
dronetype | mxtype --------: | :---------------- 1 | Replace propeller 1 | Commissioned 100 | Commissioned 2 | Commissioned 20 | Commissioned 200 | DECOMMISSIONED
这两个表如何相互关联?让我们将它们钩在一起
JOIN
上的type
。讨论:我做了一个假设,并更改了maintenance.type
,以更加描述我对这些关系的看法。
3.1。我们需要哪个JOIN
? (例如:https://www.edureka.co/blog/sql-joins-types)。我只会看INNER
和OUTER
JOIN
个。
3.1.1 INNER JOIN
仅向我们提供在两个表中匹配的记录。
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 :--------------- | -----: | ---: | :------------------ | :---------------- Lockheed Martin | 1 | 1 | 2020-01-01 00:00:00 | Replace propeller Lockheed Martin | 1 | 1 | 2020-01-01 00:00:00 | Commissioned Amazon | 3 | 100 | 2020-03-01 00:00:00 | Commissioned Northrup Grumman | 4 | 2 | 2020-04-01 00:00:00 | Commissioned DJI | 5 | 20 | 2020-05-01 00:00:00 | Commissioned Titan Aerospace | 6 | 200 | 2020-06-01 00:00:00 | DECOMMISSIONED
这不是我们真正想要的。
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 :--------------------- | -----: | ---: | :------------------ | :---------------- Lockheed Martin | 1 | 1 | 2020-01-01 00:00:00 | Replace propeller Lockheed Martin | 1 | 1 | 2020-01-01 00:00:00 | Commissioned Amazon | 3 | 100 | 2020-03-01 00:00:00 | Commissioned Northrup Grumman | 4 | 2 | 2020-04-01 00:00:00 | Commissioned DJI | 5 | 20 | 2020-05-01 00:00:00 | Commissioned Titan Aerospace | 6 | 200 | 2020-06-01 00:00:00 | DECOMMISSIONED Aerial Robotic Systems | 2 | 10 | 2020-02-01 00:00:00 | null
That shows us all of the `drones` with a `NULL` record for the non-matched one.
但是我们想在Commissioned
表中显示尚未maintenance
的无人机。
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 :-------------- | -----: | ---: | :------------------ | :---------------- Lockheed Martin | 1 | 1 | 2020-01-01 00:00:00 | Replace propeller Titan Aerospace | 6 | 200 | 2020-06-01 00:00:00 | DECOMMISSIONED
但是现在我们丢失了我们不匹配的记录,并且正在显示不需要的记录(例如Lockheed Martin
记录,其中有2条maintenance
记录,其中一条是{{1} })。
因此,让我们从Commissioned
表中选择不在drones
中具有Commissioned
记录的记录。我们可以使用maintenance
来做到这一点。
NOT EXISTS
manufacturer | serial | type | purchase_date :--------------------- | -----: | ---: | :------------------ Aerial Robotic Systems | 2 | 10 | 2020-02-01 00:00:00 Titan Aerospace | 6 | 200 | 2020-06-01 00:00:00
现在,我们有两架在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
) ;
中没有记录的无人机,它们是maintenance
。
注意:在此最终查询中,我们使用相关子查询将Commissioned
表链接到maintenance
表,并且在查询{{1} }表以仅选择具有drones
或maintenance
的记录。 mxtype
将过滤commissioned
表的查询,以排除子查询中确实具有匹配项的所有行。
您可以在此处处理查询和数据: db<>fiddle