将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查询中实现相同的结果?
如果您在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
代替
我试过了代码,它的工作原理和没有错误,我也删除了'fi.text18'组,但这次返回的行不是相同/不同的。还有重复数据返回的数据,例如:以8行返回的数据,我可以看到的唯一不同的值是在移动列上,移动和停止值。 –
如果'incoming'表中有8行,则结果集中会得到8行。 无论你只需要唯一的行,你可以使用'DISTINCT'子句(例如'SELECT DISTINCT fi.text18作为Imei,md.Device_PoliceNumber,...') 如果有多行加入' md_login“或”master_device“表。 – Pasetchnik
金科玉律不管你GROUP BY应该是选择部分 – maSTAShuFu
由于错误消息说,你在哪里上的列做一个'组by',您只能在select子句中使用该列,并且如果在select子句中需要其他列,则应该对该子句执行聚合函数。不幸的是,MySQL不会失败这个查询,但其他RDBMS会使其失败。所以你必须决定你想要哪些值不在'group by'中。 – Utsav
在您的查询中,移除'group by'并运行它。查看返回的行数。在这些行中,对于相同的'fi.text18',你想要的其他值是什么。如果您可以在该行上提供更多行数据和预期的输出,那将会更好。 – Utsav