mssql 쿼리에서 mysql 쿼리를 실행할 때 오류가 발생하는 이유를 알아 내야했습니다. 저는 SQL Server 2000을 사용하고있었습니다. 제 목표는 mysql에서 사용하는 것과 동일한 방식으로 결과를 얻는 것입니다.
데이터베이스에 대한 간단한 설명 : 데이터베이스는 수신, md_login 및 master_device의 3 가지 기본 테이블이있는 gps 추적기에 관한 것입니다.
다음은 내가 줄 테이블과 구조입니다.
테이블 수신 구조 :
이 테이블은 주로 각 차량의 GPS 추적기의 수신 데이터에 사용되므로 모든 간격이이 테이블에 수신 데이터가 있습니다. 일부 테이블 구조에 관해서는 '탕갈'이 영어로 '날짜'의 의미라고 말할 수 있습니다.
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에서 쿼리를 실행할 때 표시되는 샘플 데이터 결과입니다. 하나의 사용자 이름이 둘 이상의 차량을 가질 수 있으므로 결과가 둘 이상의 행 데이터가있을 수 있습니다.
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 쿼리에서 동일한 결과를 어떻게 얻을 수 있습니까?
당신이 (같은 집계 함수를 사용하는 경우 MAX
, SUM
는 SQL Server의 등), 당신은 다른 모든 필드를 포함해야한다 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
대신 사용하십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다