当我在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&#39;在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
所以主要的问题是:如何在sql查询中实现相同的结果?
答案 0 :(得分:0)
如果在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