2016-04-13 10 views
0

Dış uygulamamı kullandığım SQL sunucusunda bir sorgum var. Şimdi onu dönüştürmek istiyorum, böylece SQL Server ve MySQL de sorgu çalışabilir.SQL Server'da dış uygulama için alternatif yol

select top 5 v.sVehicleName as VehicleNo, ll.Location 
from vehicles v 
outer APPLY 
    (select top 1 Location 
     from location_history 
     where vehicle_id = v.vehicle_id) ll 

Her iki veritabanında çalışabilmem için bu sorguyu gizlemek zorundayım.

Bu

tablo #vehicles oluşturmak benim tablolar (vehicle_id int, sVehicleName varchar (50)) 'dir

tablo #location_history (vehicle_id int, konum varchar (50), tarih datetime)

oluşturmak #vehicles içine

uç değerleri

(1, 'M 14 aa 1111'),

(2 ', MH 12 bb 22 22 '),

(3' MH 13 cc 3333 '),

(4,' MH 42 dd 4444') #location_history değerleri

içine

ek parça (1, 'aaa', getdate()),

(1, 'bbb', getdate()),

(2, 'ccc', getdate()),

,

(3, 'eee', getdate()),

(3, 'fff', getdate()),

(2, getdate() 'ddd') (4, 'ggg', getdate()),

(4, 'hhh', getdate())

Bu benim SQL server yürütmek sorgusu olur. VehicleNo olarak

seçme v.sVehicleName, #vehicles dış

UYGULA V'den ll.Location

ll (burada vehicle_id = v.vehicle_id #location_history üst 1 Konum seçin)

Bu, SQL sunucusunda çıkar.

VehicleNo Yer

MH14 aa 1111 aaa

MH12 bb 2222 ccc

MH13 cc 3333 eee

MH42 dd 4444 ggg

Ben MySQL bu yürütmek isteyen

. ve yukarıda belirtilen aynı çıktıyı istiyorum.

+0

Tablo verilerinizi ve beklenen çıktınızı ekleyebilir misiniz? – bmsqldev

+1

araç tablasında iki sütun vardır vehicle_id, location_history konumunda iki sütun vardır vehicle_id, konum, konum geçmişi tablosunda her araç için birden fazla giriş olabilir – suraj

+0

Her bir araçta bulunan her araç için konum geçmişi tablosundan ilk kaydı istiyorum araçlar tablosu – suraj

cevap

1

Bu durumda DIŞ UYGULAMA yerine SOL JOIN kullanabilirsiniz. Böyle: Eğer araç tabloda mevcut olduğu her araç için konum geçmişi tablosundan ilk kaydını istiyorsanız

select top 5 v.sVehicleName as VehicleNo, ll.Location 
from vehicles v 
left join 
    (
    select vehicle_id, min(Location) as Location 
    from location_history 
    group by vehicle_id 
    ) ll 
on ll.vehicle_id = v.vehicle_id 
+0

yer varchar. Max'i lokasyona nasıl uygularız. Sorgunuzu kontrol ettim ama yanlış çıktı veriyor. – suraj

+0

max (x) alfabetik sıralı dizeler dizisi içinde son değeri bulur ve min (x) değeri birinci değeri bulur. [Location_history] tablosundaki sütun [LOCATION] artan sıradaysa, "top 1 Location" yerine min (Location) kullanabilirsiniz. –

+0

yanlış çıktı veriyor. – suraj

0

, sonra cross join.

ör

create table #location (vehicle_id int, vehicle_name varchar(50)) 

create table #lochistory (vehicle_id int, location varchar(50), date datetime) 



insert into #location 
values 
(1, 'car'), 
(2,'bus'), 
(3,'auto'), 
(4,'jeep') 

insert into #lochistory 
values 
(1, 'india', getdate()), 
(1, 'usa' , getdate()), 
(2, 'india', getdate()) 



select *from #location l 
cross join 
(
select top 1 * from #lochistory 
)b 

aşağıya bakınız kullanabilirsiniz çıkış aşağıdaki gibi olacaktır.

vehicle_id vehicle_name vehicle_id location date 
1   car    1   india  2016-04-13 05:21:57.650 
2   bus    1   india  2016-04-13 05:21:57.650 
3   auto   1   india  2016-04-13 05:21:57.650 
4   jeep   1   india  2016-04-13 05:21:57.650 
İlgili konular