创建视图并联接2个表查询

时间:2020-02-26 21:30:25

标签: mysql sql join sql-view

我正在为此纠缠不清,所以希望有人可以提供帮助。

我需要创建一个视图表并将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';

但是这给出了一个空表,关于我要去哪里的任何建议?

3 个答案:

答案 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)

根据您的最新评论:

逐步进行并建立您想做的事情(我们稍后将结合使用这些集合)....

  1. 您想签出所有无人机。因此,让我们从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
    
  2. maintenance表中有什么?

    SELECT * FROM maintenance ;
    
    dronetype | mxtype           
    --------: | :----------------
            1 | Replace propeller
            1 | Commissioned     
          100 | Commissioned     
            2 | Commissioned     
           20 | Commissioned     
          200 | DECOMMISSIONED   
    
  3. 这两个表如何相互关联?让我们将它们钩在一起 JOIN上的type。讨论:我做了一个假设,并更改了maintenance.type,以更加描述我对这些关系的看法。

    3.1。我们需要哪个JOIN? (例如:https://www.edureka.co/blog/sql-joins-types)。我只会看INNEROUTER 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.
    
  4. 但是我们想在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} })。

  5. 因此,让我们从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} }表以仅选择具有dronesmaintenance的记录。 mxtype将过滤commissioned表的查询,以排除子查询中确实具有匹配项的所有行。

您可以在此处处理查询和数据: db<>fiddle