SQL Server 2008复杂查询&表加入

时间:2013-09-13 16:26:58

标签: sql sql-server

这有点难以解释,但我会尽我所能。我有一个数据库,维护有关海运等信息。我有以下栏目可供使用。 (还有其他但它们对我的研究没有任何目的)我有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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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编号将主要表加入查询的这一部分。

答案 2 :(得分: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);