程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 巡邏車顯示用到的sql和pl/sql介紹

巡邏車顯示用到的sql和pl/sql介紹

編輯:關於SqlServer


  Java代碼  

select GIS_X,GIS_Y from car_trace where VEHICLE_ID ='" & carid & "' and rownum=1 order by record_time desc

  當我們做巡邏車顯示時,常常需要顯示某一輛巡邏車的最新位置,並且需要在所有的巡邏車中取得每一輛車的最新數據。這裡需要用到一些sql語句和一些pl/sql函數,這裡簡要介紹一下:

  一:基本的查詢:

  1.要查詢某一輛車的最新的經緯度值需要用如下的語句:

  Sql代碼

select GIS_X,GIS_Y from (select * from car_trace order by record_time desc) where VEHICLE_ID ='" & carid & "' and rownum=1

  而有些人會寫成如下(錯誤的寫法):

  Sql代碼

select GIS_X,GIS_Y from car_trace where VEHICLE_ID ='" & carid & "' and rownum=1 order by record_time desc

  分析:

  明白為什麼要用類似於第一句sql嵌套查詢,如果不用的話,像第二句,先查出了滿足where條件的記錄再order by,即“rownum=1”了再來排序所以枚ㄊ譴砦蟮摹K哉返氖牽Ω孟仍谂藕盟承虻募鍬賈腥ゲ檎衣愕募鍬跡皇遣檎頁鲂枰跫募鍬劑嗽偃ヅ判颍馐淺跹д呷菀著淼牡胤健?/P>

  另外,這種sql嵌套查詢在稍微復雜些的地方還是用得比較多的。

  2.如果需要在所有的巡邏車中取得每一輛車的最新數據應該怎麼做呢?需要用到sql裡的分組後排序的寫法。語法如下(具體的語法請自行參照文檔):

  row_number() over(partition by .. order by ..)

  則取所有的巡邏車中取得每一輛車的最新數據的sql語句如下:

  Sql代碼

select gis_x,gis_y,VEHICLE_ID from (select row_number() over(partition by vehicle_id order by record_time desc) flagnum,gis_x,gis_y,vehicle_id from car_trace) where flagnum=1

  分析:

  分組後排序,分組是知道了有多少車,排序是取了每輛車最新的記錄,通過"flagnum=1"來取最新的這條記錄。


  二:關於性能的優化:

  我們的car_trace時時接收GPS傳過來的經緯度、速度、方向、角度等信息,那麼這張表隨著時間的增加也會變得越來越大,雖然可以用Oracle的“”來解決問題,但我們可以用較為簡單的方法:建立一個最新的軌跡表(car_trace_now),寫個觸發器,當軌跡表有插入數據時就把這記錄觸發到car_trace_now中,沒有則插入,有則更新。這樣,car_trace_now裡總是最新的數據,並且數據量很小,有多少輛車就有多少條數據。代碼如下:

  Sql代碼   

--是否有相同的記錄 
CREATE OR REPLACE FUNCTION IS_EXISTS_REC(ID VARCHAR2) 
RETURN NUMBER 
AS 
 iReturn NUMBER; 
 CURSOR REC_EXISTS IS 
 SELECT count(*) FROM CAR_TRACE_NOW WHERE VEHICLE_ID=ID; 
BEGIN 
 iReturn := 0; 
 OPEN REC_EXISTS; 
 FETCH REC_EXISTS INTO iReturn; 
 CLOSE REC_EXISTS; 
 RETURN iReturn; 
END; 
--觸發器 
CREATE OR REPLACE TRIGGER TRI_CAR_TRACE_NOW AFTER 
INSERT ON CAR_TRACE FOR EACH ROW 
BEGIN 
 IF (IS_EXISTS_REC(:NEW.VEHICLE_ID)=0) THEN 
 INSERT INTO CAR_TRACE_NOW(GIS_X, GIS_Y, VEHICLE_ID, RECORD_TIME,SPEED,ANGLE,KM_NUM) VALUES (:NEW.GIS_X,:NEW.GIS_Y,:NEW.VEHICLE_ID,:NEW.RECORD_TIME,:NEW.SPEED,:NEW.ANGLE,:NEW.KM_NUM); 
 ELSE 
 UPDATE CAR_TRACE_NOW SET GIS_X=:NEW.GIS_X, GIS_Y=:NEW.GIS_Y,RECORD_TIME=:NEW.RECORD_TIME,SPEED=:NEW.SPEED,ANGLE=:NEW.ANGLE, KM_NUM=:NEW.KM_NUM WHERE VEHICLE_ID=:NEW.VEHICLE_ID; 
 END IF; 
END; 

  ----------------------------------END--------------------------------

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved