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

问题描述:

我被困住了,为什么在执行mssql查询的mysql查询时出现错误。我正在使用SQL Server 2000.我的目标是以与在mysql上使用相同的方式来实现结果。
将mysql查询转换为sql server 2000的mssql查询

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

下面是表和结构,我将得到:

传入表的结构:
此表主要用于GPS跟踪器对各车辆的输入数据,所以每一个间隔有”将传入数据到这个表中。至于有关的一些表结构,你可以说“tanggal”是“日期”的英文含义

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。表md_login的

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

的样本数据:

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 -
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查询中实现相同的结果?

+0

金科玉律不管你GROUP BY应该是选择部分 – maSTAShuFu

+0

由于错误消息说,你在哪里上的列做一个'组by',您只能在select子句中使用该列,并且如果在select子句中需要其他列,则应该对该子句执行聚合函数。不幸的是,MySQL不会失败这个查询,但其他RDBMS会使其失败。所以你必须决定你想要哪些值不在'group by'中。 – Utsav

+0

在您的查询中,移除'group by'并运行它。查看返回的行数。在这些行中,对于相同的'fi.text18',你想要的其他值是什么。如果您可以在该行上提供更多行数据和预期的输出,那将会更好。 – Utsav

如果您在Sql Server中使用聚合函数(如MAX,SUM等),则应在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代替

+0

我试过了代码,它的工作原理和没有错误,我也删除了'fi.text18'组,但这次返回的行不是相同/不同的。还有重复数据返回的数据,例如:以8行返回的数据,我可以看到的唯一不同的值是在移动列上,移动和停止值。 –

+0

如果'incoming'表中有8行,则结果集中会得到8行。 无论你只需要唯一的行,你可以使用'DISTINCT'子句(例如'SELECT DISTINCT fi.text18作为Imei,md.Device_PoliceNumber,...') 如果有多行加入' md_login“或”master_device“表。 – Pasetchnik