Requête complexe SQL Server 2008 et table

C'est un peu difficile à expliquer mais je ferai de mon mieux. J'ai une database qui maintient des informations sur Marine Shipping etc. J'ai les colonnes suivantes pour travailler avec. (Il y en a d'autres mais ils n'ont aucun but pour mon étude) J'ai Identificateur de message, Latitude, Longitude, MMSI (Ceci représente les signaux de vaisseau individuels, donc ils sont uniques aux vaisseaux) Ship_type, Vessel_name.

Alors, voici le problème

  • Je n'ai besoin que de Message_ID 1 et 3.
  • Malheureusement, les numéros 1 et 3 de Message_ID ont Ship_type et Vessel_name comme Null dans leurs locations respectifs.
  • Message_ID 5 a marqué Ship_type et Vessel_name.
  • Ma zone d'étude est dans la latitude et les longitudes données

Essentiellement, ce que je dois faire est d'append le Ship_type et Vessel_name aux lignes avec Message_ID 1 et 3 en joignant le numéro MMSI qui est partagé par un Message_ID 5.

les questions que j'ai jusqu'à présent ..

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

Autre requête

 WHERE Message_ID = 5; 

Comment joindre tous les types Ship_type et Vessel_name qui aboutissent à la deuxième requête à la première requête?

Je me sens comme il devrait être mentionné que tout est à l'intérieur d'une seule table autorisée dbo.DecodedCSVMEssages_Staging qui a environ 100 millions d'inputs ..: S

Je le ferais probablement comme ceci:

 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 

Je pense que vous voulez quelque chose comme ça:

 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); 
 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); 

Ici, dans la première partie de la requête, j'obtiens ship_type et vessel_name pour toutes les lignes où message_id = 5, et ensuite je rejoins cette partie de la requête avec la table principale sur la base du numéro MMSI.