2017-06-02 144 views
0

我被困住了,爲什麼在執行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

回答

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代替

+0

我試過了代碼,它的工作原理和沒有錯誤,我也刪除了'fi.text18'組,但這次返回的行不是相同/不同的。還有重複數據返回的數據,例如:以8行返回的數據,我可以看到的唯一不同的值是在移動列上,移動和停止值。 –

+0

如果'incoming'表中有8行,則結果集中會得到8行。 無論你只需要唯一的行,你可以使用'DISTINCT'子句(例如'SELECT DISTINCT fi.text18作爲Imei,md.Device_PoliceNumber,...') 如果有多行加入' md_login「或」master_device「表。 – Pasetchnik