Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将多行合并为一列的SQL UPDATE语句_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

将多行合并为一列的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列。它们不是单独的日期和时间列,它们是一个日期时间列。好的,我只是问一下,因为最初你是这样列出它们的。我也不知道哪些列在哪个表中。你真的需要用非规范化字符串更新数据库吗?我希望这是一个用户界面的精致,更好地在用户界面或视图准备层完成。这是伟大的。谢谢。对于记录,这将更新我们现有的数据库,我有一个自动更新新记录的过程。这很好。谢谢。对于记录,这将更新我们现有的数据库,我有一个自动更新新记录的流程。