如何在同一个表上内连接两个选择查询

时间:2013-04-02 14:59:45

标签: sql

我被卡住了......列'值'和'数据类型'的'数据'表填充了引擎负载和车速,每条记录都标有日期,时间,纬度,长度。我想在车辆移动时查询超过10%的发动机负载(例如速度> 0)。我可以创建一个查询来选择引擎负载,我可以创建一个查询来选择车速但是如何创建一个查询来选择引擎负载时> 10%并且车辆正在移动,其日期,时间纬度和长度相等?

此查询不起作用,但它提供了我正在尝试做的事情的主旨。任何人都可以帮我创建一个查询吗?

tables
TName:  data
PK  datakey
    value
fk1 dataeventkey
fk2 datatypenamekey

TName: datatypename
PK datatypenamekey
   datatypename

TName: dataevent
PK dataeventkey
   datetime
   lat
   long
SELECT 
   d1.datetime 
FROM 
    (data INNER JOIN datatypename ON data.datatypenamekey = datatypename.datatypenamekey    
    INNER JOIN dataevent ON dataevent.dataeventkey = data.dataeventkey) d1  
WHERE 
    ( d1.datatypename = "Engine Load [%]" AND d1.value > 10 )

 INNER JOIN

SELECT 
    d2.datetime  
FROM 
    (data INNER JOIN datatypename ON data.datatypenamekey = datatypename.datatypenamekey  
    INNER JOIN dataevent ON dataevent.dataeventkey = data.dataeventkey) d2  
WHERE 
    ( d2.datatypename = "Vehicle Speed [mph]" AND d2.value > 0 ) 

    ON d1.datetime = d2.datetime

1 个答案:

答案 0 :(得分:7)

我不是100%肯定我理解,但我认为你只需要引用同一个表的两个实例。有点基于你的SQL做出一些假设,但是在这里给它一个镜头:

SELECT 
    engineLoad.dateTime
FROM
    (
    SELECT 
       d.datakey,
       de.datetime        
    FROM 
        data d
        INNER JOIN datatypename dt ON data.datatypenamekey = dt.datatypenamekey    
        INNER JOIN dataevent de ON de.dataeventkey = d.dataeventkey  
    WHERE 
        d.value > 10 AND
        dt.datatypename = "Engine Load [%]"
    ) engineLoad
    INNER JOIN
    (
    SELECT 
       d.datakey,
       de.datetime        
    FROM 
        data d
        INNER JOIN datatypename dt ON data.datatypenamekey = dt.datatypenamekey    
        INNER JOIN dataevent de ON de.dataeventkey = d.dataeventkey  
    WHERE 
        d.value > 0  AND
        dt.datatypename = "Vehicle Speed [mph]" 
    ) vehicleSpeed 
        ON engineLoad.dataKey = vehicleSpeed.dataKey <==might need to remove this line
           AND engineLoad.datetime = vehicleSpeed.datetime

修改 看起来你需要两次引用datatypename?编辑了上述内容,请再试一次。