我被困住了,爲什麼在執行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查詢中實現相同的結果?
金科玉律不管你GROUP BY應該是選擇部分 – maSTAShuFu
由於錯誤消息說,你在哪裏上的列做一個'組by',您只能在select子句中使用該列,並且如果在select子句中需要其他列,則應該對該子句執行聚合函數。不幸的是,MySQL不會失敗這個查詢,但其他RDBMS會使其失敗。所以你必須決定你想要哪些值不在'group by'中。 – Utsav
在您的查詢中,移除'group by'並運行它。查看返回的行數。在這些行中,對於相同的'fi.text18',你想要的其他值是什麼。如果您可以在該行上提供更多行數據和預期的輸出,那將會更好。 – Utsav