2012-07-02 21 views
1

我與航空公司的數據的工作,所以我有這樣SQL UPDATE語句多行合併成一列

SELECT Invoices.PNR, Segments.Depart, Segments.Arrival, Segments.DepartDateTime 
FROM Invoices AS i INNER JOIN Segments AS s 
ON i.Invoice_ID = s.Invoice_ID` 
WHERE PNR = 'AAAAAA' 

查詢這將返回

PNR Depart Arrival DepartDateTime 
AAAAAA DFW MCI  7/2/2012 7:30 AM 
AAAAAA MCI LAX  7/2/2012 11:30 AM 
AAAAAA LAX DFW  7/4/2012 2:30 PM 

我叫發票列我想要顯示的路由'DFW-MCI-LAX-DFW'這是否可以使用SQL方法?這些段按順序排列,因此DFW-MCI首先是MCI-LAX,然後是LAX-DFW。

編輯:如果我可以用DFW-MCI-MCI-LAX-LAX-DFW更新數據庫,這是完全可以接受的。我可以去除視圖圖層上的重複條目。

我可以很容易地在ColdFusion中編寫它,但循環和數千次數據庫更新需要永久。我也可以對每100條記錄進行一次大規模更新,但我想避免使用除SQL以外的其他任何內容

+0

爲什麼你認爲在SQL Server中循環會快得多?你能否用正確版本的SQL Server標記?你能告訴我們如何從數據中知道它不是'LAX-DFW-MCI-LAX'嗎? (換句話說,我們怎麼知道原產地是DFW)? [也可以停止使用舊式隱式連接](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins。 ASPX)? –

+0

你能列出旅行時間專欄嗎?他們真的是獨立的日期和時間列嗎?此外,博客文章不是重命名任何東西,而是關於不使用隱式連接。你讀過整件事了嗎?我如何將訂單重命名爲o並且與您重新命名發票不同? –

+0

我添加了departarttime列。它們不是單獨的日期和時間列,它們是一個日期時間列。 –

回答

1

以下是如何獲取價值的信息。我同意@automatic關於是否應該使用這些數據實際更新數據庫。由於每當任何行更改時都必須重新計算它。

;WITH x AS 
(
    SELECT i.PNR, i.Invoice_ID, s.Depart, s.Arrival, s.DepartDateTime, 
    rn = ROW_NUMBER() OVER (PARTITION BY i.PNR ORDER BY s.DepartDateTime) 
    FROM dbo.Invoices AS i 
    INNER JOIN dbo.Segments AS s 
    ON i.Invoice_ID = s.Invoice_ID 
    WHERE i.PNR = 'AAAAAA' 
) 
SELECT x.PNR, x.Invoice_ID, Routing = (SELECT 
    CASE WHEN rn1 = 1 THEN Depart ELSE '' END 
    + '-' + Arrival 
    FROM x AS x2 
    WHERE x.PNR = x2.PNR 
    AND x.Invoice_ID = x2.Invoice_ID 
    ORDER BY x2.DepartDateTime 
    FOR XML PATH('') 
) 
FROM x 
GROUP BY x.PNR, x.Invoice_ID; 
+0

這太好了。非常感謝。爲了記錄,這將更新我們現有的數據庫,並且我有一個自動更新新記錄的過程。 –