2013-09-13 6 views
2

Это немного сложно объяснить, но я постараюсь изо всех сил. У меня есть база данных, которая хранит информацию о морском судоходстве и т. Д. У меня есть следующие столбцы для работы. (Есть другие, но у меня нет какой-либо цели для моего исследования). У меня есть Message_ID, Latitude, Longitude, MMSI (Это представляет собой отдельные сигналы судна, поэтому они уникальны для кораблей) Ship_type, Vessel_name.SQL Server 2008 Complex Query & Table Join

Так вот вопрос

  • мне нужно только 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.

запросы у меня есть до сих пор ..

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, ЧТО ИМЕЕТ О 100 МЛН ЗАПИСИ ..: S

ответ

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

Здесь в первой части запроса я получаю ship_type и имя судна для всех строк, где message_id = 5, а затем я присоединяюсь к этой части запроса с главной таблицей на основе номера MMSI.

+1

Вы собираетесь получить умножения на вашей регистрацию, если таблица не является уникальной на '(MMSI, Message_ID). – RBarryYoung

+0

Спасибо за указание @RBarryYoung, я отредактировал код, чтобы рассмотреть только отдельные. – Sonam

+0

Хорошо, я предположил, что (Message_ID, MMSI) был уникальным и в моем ответе. «TOP (1)» обращается к нему в любом случае. –

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 
+0

, что делает t13. и t5. стоять? – dpalm

+1

@dpalm - это удобный синтаксис, называемый [псевдоним таблицы] (http://technet.microsoft.com/en-us/library/ms187455.aspx). –

+0

так что вы указали имя таблицы как псевдоним? – dpalm

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

что делает x стоит для? – dpalm

+0

Это псевдоним, данный части «OUTER APPLY» в запросе. –