2013-09-16 59 views
0

之前我躺在出了問題,這裏是我的關於數據的信息:SQL表創建從連接數據的

Table Name: dbo.DecodedCSVMessages_Staging 
Columns: MMSI, Message_ID, Time, Vessel_Name, Ship_Type, IMO, Dimension_to_Bow, Dimension_to_stern, Dimension_to_port, Dimension_to_starboard, Draught, Longitude, Latitude 

我需要創建一個新表。這下面是什麼,我需要在表格中:

我感興趣的所有數據,但我只需要與Message_ID的是1或3 **問題是,與Message_ID的1和3 **缺乏如下: (僅對於Message_ID爲5)。

Vessel_Name, Ship_Type, IMO, 
Dimension_to_Bow, 
Dimension_to_stern, 
Dimension_to_port, 
Dimension_to_starboard, 
Draught 

對於Message_ID的1和3,這些列標記爲NULL。他們所擁有的是

Longitude, 
Latitude, 
Time, 
MMSI 

(這是所有標記NULL的Message_ID的等於5

MMSI就是在這種情況下的主鍵。 Message_ID的1,3和5將全部具有代表給定船舶的MMSI號碼。這些MMSI是重複發生的,因爲每艘船發出多個類型1,3和5的消息。所以說我們有一個MMSI 210293000,這個號碼將與幾個Message_ID的不同類型一起。所以我需要做的是抓取1和3的所有Message_ID,並將Message_ID中的信息附加到1和3的5。所以在那裏,列不再是NULL。

最後但並非最不重要的,我只選擇MESSAGE_ID 1和3的屬於以下範圍內的:幾列如何看待

Where Latitude > 55 and Latitude <85 and Longitude > 50 and Longitude < 141; 

例子:

MMSI/ Message_ID /Time/Ship_type/Vessel_Name/Latitude/Longitude 

21029300, 3, 2012-06-01, NULL, NULL, 56.528003, 85.233443 

21029300, 5, 2012-07-01, 70, RIO_CUBAL, NULL, NULL 

2109300, 1, 2012-08-01, NULL, NULL, 57.432345, 131.123343 

2109300, 1, 2012-09-01, NULL, NULL, 62.432345, 121.123343 

2109300, 1, 2012-09-02, NULL, NULL, 65.432345, 140.123343 

21029300, 5, 2012-08-01, 70, RIO_CUBAL, NULL, NULL 

最終結果是從這個數據如下:

21029300, 3, 2012-06-01, 70, RIO_CUBAL, 56.528003, 85.233443 

2109300, 1, 2012-08-01, 70, RIO_CUBAL, 57.432345, 131.123343 

2109300, 1, 2012-09-01, 70, RIO_CUBAL, 62.432345, 121.123343 

2109300, 1, 2012-09-02, 70, RIO_CUBAL, 65.432345, 140.123343 

謝謝!

+0

作爲一個,你的問題很難閱讀。我改進了它,但你可以進一步擦亮它。那麼我們可能會更感興趣,如果你能夠嘗試某些東西,並且出於某種原因失敗(請說明原因)。 – mnagel

+0

對於給定的船舶,你有多行,'Message_ID'是'1'或'3'?你也有多行,'Message_ID'也是'5'的那些船呢?你打算如何連接它們?含義:例如,哪個3值行要連接到哪個5值行? –

+0

就是這樣,一艘船將發出許多消息1,3和5,但每條消息都包含特定信息。信息1和信息3有經緯度,但沒有船隻名稱或類型等。它們只在信息5中發出信息。但我也需要這些信息。所以我需要創建一個只有消息1和3(在我的給定經緯度內)的新表,但是包含消息5的信息。 (因爲它不包含在1和3中) – dpalm

回答

0

在單筆交易中,創建新表,使用INSERT INTO ... SELECT ...將數據從DecodedCSVMessages_Staging轉移到新表中,然後DELETE FROM ...DecodedCSVMessages_Staging刪除舊數據。

+0

我對數據庫有點新鮮,我不確定它會是什麼樣子。另外,我沒有權限更改現有表 – dpalm

+0

http://www.sqlteam.com/article/using-select-to-insert-records。我想你不必刪除舊數據,但我假設你想移動,而不是複製它。 –

0

您可以選擇類型1和類型3消息,並將信息從聯接中添加到數據中第一個對應的類型5記錄。 (如果沒有相應的類型5的記錄,你會得到這些字段空值)試試這個:

SELECT DISTINCT M13.MMSI, M13.Message_ID, M13.Time, M13.Latitude, M13.Longitude, 
M5.Vessel_Name, M5.Ship_Type, M5.IMO, M5.Dimension_to_Bow 
M5.Dimension_to_stern, M5.Dimension_to_port, 
M5.Dimension_to_starboard, M5.Draught 
FROM dbo.DecodedCSVMessages_Staging M13 
JOIN (
SELECT MMSI, Time, Vessel_Name, Ship_Type, IMO, Dimension_to_Bow 
Dimension_to_stern, Dimension_to_port, Dimension_to_starboard, 
Draught 
FROM dbo.DecodedCSVMessages_Staging 
WHERE Message_ID = 5 
ORDER BY Time 
) M5 
ON M5.MMSI = M13.MMSI 
WHERE M13.Message_ID IN (1, 3) 
AND M13.Latitude > 55 
AND M13.Latitude < 85 
AND M13.Longitude > 50 
AND M13.Longitude < 141 
ORDER BY M13.Time 

如果返回你想要的數據,然後創建一個新表,並使用INSERT INTO NewTable SELECT插入記錄。

請注意,MMSI不是舊錶或新表中的主鍵。主鍵(PK)必須是唯一的,在這種情況下,每個MMSI都有多個條目。

當您創建新表時,您應該添加一個整數IDENTITY字段,以便它將具有PK。此IDENTITY字段未包含在插入語句中,但會自動填充遞增的整數。這樣每個記錄獲得一個獨特的PK,這是非常可取的。

EDITED在外部查詢上使用DISTINCT

+0

當我嘗試此查詢我得到的初始選擇標準紅線,例如,如果我將鼠標懸停我M13.MMSI的鼠標,它說: 多部分標識符「M13.MMSI」無法綁定 – dpalm

+0

@criticalfix我認爲你在這裏加入了一組完全相同的行,所以這可能無法按需要工作。 –

+0

感謝@papatoob和@dpalm - 我沒有想到'TOP 1'會如何工作。我需要重新考慮並編輯它。 – criticalfix

0

考慮到評論部分的所有信息(特別是關於一次性註釋),您可以嘗試以下SQL語句。然而,這隻會在你說過的「類型5」信息的相關數據真正一致時才起作用!

SELECT Messages.MMSI 
    ,Messages.Message_ID 
    ,Messages.TIME 
    ,Type5Messages.Vessel_Name 
    ,Type5Messages.Ship_Type 
    ,Type5Messages.IMO 
    ,Type5Messages.Dimension_to_Bow 
    ,Type5Messages.Dimension_to_stern 
    ,Type5Messages.Dimension_to_port 
    ,Type5Messages.Dimension_to_starboard 
    ,Type5Messages.Draught 
    ,Messages.Longitude 
    ,Messages.Latitude 
INTO [DataBaseName].[dbo].[YourNewTableName] 
FROM dbo.DecodedCSVMessages_Staging Messages 
LEFT OUTER JOIN (
    SELECT DISTINCT MMSI 
     ,Vessel_Name 
     ,Ship_Type 
     ,IMO 
     ,Dimension_to_Bow 
     ,Dimension_to_stern 
     ,Dimension_to_port 
     ,Dimension_to_starboard 
    FROM dbo.DecodedCSVMessages_Staging 
    WHERE Messages.Message_ID = 5 
    ) Type5Messages 
    ON Messages.MMSI = Type5Messages.MMSI 
WHERE Messages.Message_ID IN (1,3) 
    AND Messages.Latitude > 55 
    AND Messages.Latitude < 85 
    AND Messages.Longitude > 50 
    AND Messages.Longitude < 141; 

在這份聲明中可以選擇所有「類型1」和「3型」行,並與具有相同MMSI值「式5」行加入他們的行列。如果關於所選列的「類型5」信息是一致的,則每個「類型5」行只有一個條目,因此每個「類型1」和「類型3」行只會出現一次。不過,你一定要做一些測試。
INTO [DataBaseName].[dbo].[YourNewTableName]行(您將不得不調整命名方式)使用原始表的數據類型創建一個新表(如果您選擇尚未使用的名稱)並插入所選行。如果您需要指數,鍵,關係或任何其他信息,您可能稍後要更改此表。

+0

如果某些船舶沒有「類型5」消息,我只是將初始'INNER JOIN'更改爲'LEFT OUTER JOIN'。 –