2016-04-13 4 views
0

У меня есть запрос на SQL-сервере, в котором я использовал внешний вид. Теперь я хочу преобразовать его так, чтобы запрос мог работать и на SQL-сервере, и на MySQL.Альтернативный способ для внешнего применения в SQL Server

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 

Мне нужно скрывать этот запрос, чтобы я мог работать в обеих базах данных.

Это мои таблицы

создать таблицу #vehicles (vehicle_id ИНТ sVehicleName VARCHAR (50))

создать таблицу #location_history (vehicle_id Int, расположение VARCHAR (50), дата DateTime)

вставка в #vehicles значения

(1, 'МН 14 аа 1111'),

(2, 'МН 12 бб 22 22 '),

(3,' МН 13 куб.см 3333 '),

(4,' МН 42 дд 4444')

вставки в #location_history значений

(1, 'ааа', GETDATE()),

(1, 'BBB', GETDATE()),

(2, 'ссс', GETDATE()),

(2, 'ддд', GETDATE()),

(3, 'еее', GETDATE()),

(3, 'FFF', GETDATE()),

(4, 'ггг', GETDATE()),

(4, 'HHH', GetDate())

Это запрос, который я исполняю в сервере SQL.

выберите v.sVehicleName, как VehicleNo, ll.Location

от #vehicles v

внешняя APPLY

(выберите верхний 1 Расположение от #location_history , где vehicle_id = v.vehicle_id) LL

Это выводится на SQL-сервере.

VehicleNo Расположение

MH14 аа 1111 ааа

MH12 бб 2222 ссс

MH13 куб.см 3333 еее

MH42 дд 4444 ггг

Я хочу, чтобы выполнить это в MySQL. и я хочу, чтобы тот же результат упоминался выше.

+0

Можете ли вы добавить данные таблицы и ожидаемый результат? – bmsqldev

+1

в таблице автомобилей есть две колонки vehicle_id, vehicle_name в location_history Есть два столбца vehicle_id, местоположение, дата в таблице истории местоположения может быть несколько записей для каждого транспортного средства – suraj

+0

Я хочу, чтобы первая запись из таблицы истории местоположений для каждого транспортного средства, которое присутствует в транспортные средства стол. – suraj

ответ

1

В этом случае вы можете использовать LEFT JOIN вместо OUTER APPLY. как то:

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

местоположение - варчар. как мы можем применять max на месте. Я проверил ваш запрос, но он дает неправильный вывод. – suraj

+0

max (x) находит последнее значение в алфавитном упорядоченном множестве строк, а min (x) находит первое значение. Если столбец [РАСПОЛОЖЕНИЕ] в таблице [location_history] упорядочен по возрастанию, вы можете использовать min (Location) вместо «top 1 Location». –

+0

он дает неправильный выход. – suraj

0

Если вы хотите, первую запись из истории расположения таблицы для каждого транспортного средства, которое присутствует в таблице транспортных средств, , то вы можете использовать cross join.

см ниже, например

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 

в выход будет выглядеть следующим образом.

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