2

这有点难以解释,但我会尽力而为。我有一个数据库,用于维护有关海运等的信息。我有以下几列可供使用。(还有其他的,但它们对我的研究没有任何目的)我有 Message_ID、纬度、经度、MMSI(这代表个别船舶信号,因此它们是船舶独有的)Ship_type、Vessel_name。

所以这里的问题

  • 我只需要 Message_ID 的 1 和 3。
  • 不幸的是,Message_ID 的 1 和 3 在它们各自的位置中将 Ship_type 和 Vessel_name 设为 Null。
  • Message_ID 5 同时标记了 Ship_type 和 Vessel_name。
  • 我的研究区域在给定的经纬度范围内

基本上我需要做的是将 Ship_type 和 Vessel_name 附加到 Message_ID 为 1 和 3 的行,方法是通过 Message_ID 5 共享的 MMSI 号码加入。

到目前为止我的查询..

WHERE (latitude > 55 and latitude < 85 and longitude > 50 and longitude < 141) And (Message_ID = 1 or Message_ID = 3);

其他查询

WHERE Message_ID = 5;

如何将导致第二个查询的所有 Ship_type 和 Vessel_name 加入第一个查询?

我觉得应该提到所有内容都在一个名为 dbo.DecodedCSVMEssages_Staging 的表中,该表有大约 1 亿个条目.. :S

4

3 回答 3

2

我可能会这样做:

SELECT
     t13.Message_ID, 
     t13.Latitude, 
     t13.Longitude, 
     t13.MMSI,
     t5.Ship_type, 
     t5.Vessel_name
FROM yourTable As t13
OUTER APPLY (   SELECT TOP 1 * 
                FROM  yourTable As t5
                WHERE t5.Message_ID = 5
                  AND t5.MMSI = t13.MMSI
             ) As t5
WHERE t13.Message_ID IN(1,3)
  AND t13.latitude > 55 
  and t13.latitude < 85 
  and t13.longitude > 50 
  and t13.longitude < 141
于 2013-09-13T16:39:49.977 回答
0
with ship_cte(Ship_type,Vessel_name,MMSI)
as(select Distinct Ship_type,Vessel_name,MMSI  from TableName WHERE Message_ID = 5)

select b.Ship_type,b.Vessel_name,a.other_columns 
from tableName a join ship_cte b on a.MMSI=b.MMSI
WHERE (a.latitude > 55 and a.latitude < 85 and a.longitude > 50 and a.longitude < 141) 
And (a.Message_ID = 1 or a.Message_ID = 3);

在查询的第一部分中,我得到了 message_id=5 的所有行的 ship_type 和vessel_name,然后我根据 MMSI 编号将查询的这一部分与主表连接起来。

于 2013-09-13T16:39:13.633 回答
0

我想你想要这样的东西:

select Message_ID, Latitude, Longitude, MMSI, x.Ship_type, x.Vessel_name
from table t
outer apply (select Ship_type, Vessel_name from table x where x.MMSI=t.MMSI and x.Message_ID=5) x
where t.Message_ID in (1,3) and (latitude > 55 and latitude < 85 and longitude > 50 and longitude < 141);
于 2013-09-13T16:43:57.280 回答