2016-04-13 6 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 int型、sVehicleName VARCHAR(50))を作成することです

テーブル#location_history(vehicle_id int型、場所はvarchar(50)、日付日時)

を作成

#vehicles 値BB 22

(1 'MH 14 AA 1111')、

(2 'MH 12に挿入22 ')、

(3' MH 13 CC 3333 ')、

(4、' DD 4444' MH 42)

#location_history値

(1、挿入'AAA'、GETDATE())、

(1、 'BBB'、GETDATE())、

(2、 'CCC'、GETDATE())、

(2 'dddを'、GETDATE())、

(3、 'EEE'、GETDATE())、

(3、 'FFF'、GETDATE())、

(4、 'GGG'、GETDATE())、

(4、 'HHH'、GETDATE())

これは、私はSQLサーバーで実行するクエリです。

VehicleNoとしてv.sVehicleNameを選択し、#vehiclesからll.Location

は、LL(#location_history vehicle_id = v.vehicle_idからトップ1場所 を選択)を適用

外側

をV

これはSQLサーバーに出力されます。

VehicleNo場所

MH14のAA 1111 AAA

MH12のBB 2222 CCC

MH13のCC 3333 EEE

MH42 ddの4444 GGG

私は、MySQLでこれを実行する

。上記の同じ出力が必要です。

+0

テーブルデータと予想される出力を追加できますか?車両テーブル内に – bmsqldev

+1

が2列あるlocation_historyにvehicle_id、vehicle_nameが2列あるvehicle_id、location、location history table内の日付各車両に複数のエントリが存在する可能性がある – suraj

+0

存在する各車両の位置履歴テーブルから最初のレコードを取得する車両テーブル。 – suraj

答えて

1

この場合、OUTER APPLYではなくLEFT JOINを使用できます。そのような:

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

ロケーションはvarcharです。どのようにして最大限の位置情報を適用できますか?私はあなたのクエリをチェックしたが、それは間違った出力を与えている。 – suraj

+0

max(x)はアルファベット順の文字列で最後の値を見つけ、min(x)は最初の値を見つけます。 [location_history]テーブルの[LOCATION]列が昇順に並んでいる場合は、「トップ1ロケーション」の代わりに「min(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 
関連する問題