将 mysql 查询转换为 sql server 2000 的 mssql 查询

朱利叶斯·英卓万·哈利姆

当我在 mssql 查询上执行 mysql 查询时,我一直在弄清楚为什么会出现错误。我使用的是 sql server 2000。我的目标是用我在 mysql 上使用的相同方式实现结果。

关于数据库的一点说明:该数据库是关于具有 3 个主表的 gps 跟踪器:incoming、md_login 和 master_device。

这是我将给出的表格和结构:

传入
结构:该表主要用于每辆车的gps跟踪器传入数据,因此每个间隔都会有传入数据进入该表。关于一些表结构,你可以说'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

表md_login的结构:
该表用于存储车辆的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

表 md_login 的示例数据:

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

表 master_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

表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)是根据来自表调用传入的最新更新来获取行结果。下一步是:我正在从最新的传入表与完整的传入表进行内部连接,因此将返回的数据基于已经内部连接的最新传入数据。

这是我在 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 server 2000 上执行查询时,出现如下错误:

服务器:消息 8120,级别 16,状态 1,第 1 行。
选择列表中的列“md.Device_PoliceNumber”无效,因为它不包含在聚合函数或 GROUP BY 子句中。

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

帕塞奇尼克

如果您使用聚合函数(例如MAXSUM在SQL服务器等),你应该在其他所有领域的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改用

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章