简体   繁体   English

在另一个子查询中使用子查询中的列并在子查询中选择多个列

[英]Using a column from a subquery in another subquery & selecting multiple column in subquery

Please have a look at the SQL query below: 请查看下面的SQL查询:

I want to store the column value log_LogId (line 6) in @startlog so that I can use it later in line 15. or is there any other way to achive this? 我想将列值log_LogId (第6行)存储在@startlog以便稍后在第15行中使用它。或者还有其他方法可以实现此目的吗?

I can't write @log_LogId = log_LogId in line 6. It shows syntax error. 我无法在第6行中编写@log_LogId = log_LogId 。它显示语法错误。

Another question is how can I select multiple columns in the first subquery? 另一个问题是如何在第一个子查询中选择多个列? perhaps like (SELECT TOP 1 log_LogId, log_Cost ..... ? 也许像(SELECT TOP 1 log_LogId, log_Cost .....

Thanks in Advance. 提前致谢。

DECLARE @startlog INT   
SELECT 
    log_VehicleId AS gpsId,
    log_LogId AS ignOnLogId,
    (SELECT TOP 1
        log_LogId ---Set this value to @startlog so that I can use this in "HERE"
            --- Also Select another column here
        FROM VehicleLog
        WHERE log_Eventid = 6012 AND log_LogId > v2.log_LogId 
        AND log_VehicleId = v2.log_VehicleId
    ) ignOffLogId,
    (SELECT SUM(CAST(log_COG AS FLOAT))
        FROM VehicleLog
        WHERE log_LogId >= v2.log_LogId
        AND log_LogId <= @startlog ---**HERE**
    )
from VehicleLog v2
WHERE log_Eventid = 6011 AND log_LogId < 300

You can use a CTE (Common Table Expression) as follows: 您可以按如下方式使用CTE(公用表表达式):

;WITH CTE_V2 AS

(

    SELECT

        log_VehicleId 
        , log_LogId
    FROM
        VehicleLog

    WHERE 
        log_Eventid = 6011 AND log_LogId < 300

)

, CTE_IGN_OFF AS

(

    SELECT TOP 1

        log_LogId ---Set this value to @startlog so that I can use this in "HERE"

        ,log_OtherColumn    --- Also Select another column here

    FROM 
        VehicleLog

    WHERE 
        log_Eventid = 6012 
        AND log_LogId > (SELECT MAX(CTE_V2.log_LogId) 
                FROM CTE_V2 WHERE VehicleId = CTE_V2.log_VehicleId)
)
, CTE_COG AS
(
    SELECT 
        log_VehicleId AS gpsId
        , log_LogId AS ignOnLogId
        , SUM(CAST(log_COG AS FLOAT)) sum_COG
        FROM 
        VehicleLog
        WHERE 
        log_LogId >= (SELECT MAX(CTE_V2.log_LogId) 
                FROM CTE_V2 WHERE VehicleId = CTE_V2.log_VehicleId)
            AND log_LogId <= (SELECT TOP 1 log_OtherColumn FROM CTE_IGN_OFF)
    GROUP BY
        log_VehicleId
        , log_LogId
)
SELECT * FROM  CTE_COG;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM