将多行合并为一列的SQL UPDATE语句
我正在处理航空公司数据,所以我有一个这样的查询将多行合并为一列的SQL UPDATE语句,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我正在处理航空公司数据,所以我有一个这样的查询 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
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
我在发票中有一个名为routing的列,我想显示“DFW-MCI-LAX-DFW”这是否可以使用纯SQL方法?这些段是按顺序列出的,因此DFW-MCI首先是MCI-LAX,然后是LAX-DFW
编辑:如果我可以用DFW-MCI-MCI-LAX-LAX-DFW更新数据库,这是完全可以接受的。我可以去掉视图层上的重复条目
我可以很容易地用ColdFusion编写这篇文章,但是循环和数千次数据库更新要花很长时间。我还可以对每100条记录进行一次大规模更新,但我希望避免使用SQL以外的任何方法,这里是获取值的方法。我同意@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;
下面是如何获得值的方法。我同意@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;
为什么您认为SQL Server中的循环会快得多?您能用正确的SQL Server版本进行标记吗?您能告诉我们如何从数据中判断它不是LAX-DFW-MCI-LAX?(换句话说,我们如何知道来源是DFW)?你能列出旅行时间栏吗?它们真的是分开的日期和时间列吗?此外,这篇博文并不是关于重命名任何东西,而是关于不使用隐式连接。你看了整件事了吗?我如何将订单重命名为o,与您如何将发票重命名为i不同?我添加了departdatetime列。它们不是单独的日期和时间列,它们是一个日期时间列。好的,我只是问一下,因为最初你是这样列出它们的。我也不知道哪些列在哪个表中。你真的需要用非规范化字符串更新数据库吗?我希望这是一个UI的精确性,最好在UI或视图预操作层中完成。为什么您认为SQL Server中的循环会快得多?您能用正确的SQL Server版本进行标记吗?您能告诉我们如何从数据中判断它不是LAX-DFW-MCI-LAX?(换句话说,我们如何知道来源是DFW)?你能列出旅行时间栏吗?它们真的是分开的日期和时间列吗?此外,这篇博文并不是关于重命名任何东西,而是关于不使用隐式连接。你看了整件事了吗?我如何将订单重命名为o,与您如何将发票重命名为i不同?我添加了departdatetime列。它们不是单独的日期和时间列,它们是一个日期时间列。好的,我只是问一下,因为最初你是这样列出它们的。我也不知道哪些列在哪个表中。你真的需要用非规范化字符串更新数据库吗?我希望这是一个用户界面的精致,更好地在用户界面或视图准备层完成。这是伟大的。谢谢。对于记录,这将更新我们现有的数据库,我有一个自动更新新记录的过程。这很好。谢谢。对于记录,这将更新我们现有的数据库,我有一个自动更新新记录的流程。