将 mysql 查询转换为 sql 服务器 2000 的 mssql 查询

Converting mysql query to mssql query for sql server 2000

当我对 mssql 查询执行 mysql 查询时,我一直在弄清楚为什么会出现错误。我使用的是 sql 服务器 2000。我的目标是使用与 mysql.

相同的方式实现结果

关于数据库的一点解释:数据库是关于一个gps跟踪器的,主要有3个table:传入,md_login,和master_device.

这是 table 和我将给出的结构:

结构table传入:
这个table主要用于每辆车的gps tracker的传入数据,所以每个间隔都会有传入数据到这个table中。关于一些table的结构,可以说'tanggal'就是英文'date'的意思

Text1 varchar
...
Text18 varchar <used as imei>
...
Text31 varchar
Distance varchar
Tanggal datetime
TanggalIncoming datetime 
StartDate datetime
EndDate datetime
EngineStatus varchar
AccStatus varchar
Moving varchar
Address varchar

tablemd_login的结构:
这个table用来存放车辆的imei数据,所以1个Log_ID可以有多个Log_DeviceID.

Log_ID char <used as username>
Log_DeviceID varchar <used as vehicle number> 
Log_DeviceIMEI varchar <used as imei>
Log_Date datetime

table的示例数据md_login:

Log_ID - Alex
Log_DeviceID - B 7777 GHI
Log_DeviceImei - 012896001194123
Log_Date - 2017-05-30 13:46:57

tablemaster_device的结构:

Device_Imei varchar
Device_PoliceNumber char
Device_MobileNumber char
Device_MobileNumber2 char
Model varchar
Port char
PortDevice char
ActiveDate datetime
LastUpdate datetime
IdxConn varchar
CommandOperate char
Picture varchar

table的示例数据master_device:

Device_Imei - 012896001194123
Device_PoliceNumber - B 7777 GHI
Device_MobileNumber - 01234567
Device_MobileNumber2 - 
Model - STV-08
Port - 340
PortDevice - 20557
ActiveDate - 2017-05-30 13:46:57
LastUpdate - Null
IdxConn - Null
CommandOperate - Null
Picture - livina_grey.png

这是已经在 mysql 上运行的查询:

SELECT fi.text18 as Imei,
        md.Device_PoliceNumber,
        fi.Text6 as Lat,
        fi.Text8 as Lng,
        fi.Text10 as Speed,
        fi.Text16 as Gps_Signal,
        fi.Text21 as Battery,
        fi.Text22 as Charging,
        fi.Text29 as Oil,
        fi.Text30 as Temperature,
        md.Picture,
        fi.EngineStatus,
       fi.TanggalIncoming,
       fi.Moving,
        fi.Address
    FROM incoming fi
    INNER JOIN (SELECT MAX(tanggalincoming) as maxtglincoming,text18,moving
                 FROM incoming
                 GROUP BY text18) ri
     ON ri.maxtglincoming = fi.tanggalincoming AND
            ri.text18=fi.text18
    INNER JOIN md_login AS mdl ON (ri.text18=mdl.log_deviceimei AND
    mdl.log_id='alex')
    INNER JOIN master_device AS md ON md.device_imei=mdl.log_deviceimei
    GROUP BY fi.text18
    ORDER BY md.Device_PoliceNumber ASC

关于查询的一点解释: 所以我首先使用 MAX(tanggalincoming) 来根据来自 table 呼叫传入的最新更新获取行结果。下一步是:我正在使用完整的传入 table 从最新传入的 table 进行内部联接,因此 return 的数据基于已经内部联接的最新传入数据.

这里是我在 mysql 中执行查询时将显示的示例数据结果。由于 1 个用户名可以有超过 1 辆车,因此可以有超过 1 行数据的结果。

Imei - 012896001194123
Device_PoliceNumber - B 7777 GHI
Lat - -6.27585
Lng - 106.66172
Speed 0
Gps_Signal F
Battery - F:4.18V
Charging - 1
Oil - Null
Temperature - Null
Picture - livina_grey.png
EngineStatus - OFF
TanggalIncoming - 2017-05-31 05:25:59
Moving - STOP 
Address - Example Street 

但是当我尝试在 sql 服务器 2000 上执行查询时,出现如下错误:

Server: Msg 8120, Level 16, State 1, Line 1.
Column 'md.Device_PoliceNumber' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

所以主要问题是:如何在 sql 查询中获得相同的结果?

如果您在 Sql 服务器中使用聚合函数(如 MAXSUM 等),您应该在 GROUP BY 子句中包含所有其他字段。

在这种情况下,在您的子查询中您有 SELECT MAX(tanggalincoming) as maxtglincoming,text18,moving,但只有 text18 包含在 GROUP BY 中。 应如下所示:

SELECT MAX(tanggalincoming) as maxtglincoming,text18,moving
FROM incoming
GROUP BY text18,moving

第二个是你在大查询中没有任何聚合函数。所以你应该删除它。

如果您使用 GROUP BY 来抑制重复,请改用 DISTINCT