1

我正在处理航空公司数据,所以我有这样的查询

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

我在 Invoices 中有一个名为 routing 的列,我想显示 'DFW-MCI-LAX-DFW' 这是否可以使用仅 SQL 的方法?这些段按顺序列出,因此 DFW-MCI 首先是 MCI-LAX,然后是 LAX-DFW。

编辑:如果我可以用 DFW-MCI-MCI-LAX-LAX-DFW 更新数据库,那是完全可以接受的。我可以去掉视图层上的重复条目。

我可以很容易地在 ColdFusion 中编写它,但是循环和数以千计的数据库更新需要很长时间。我也可以对每 100 条记录进行一次大规模更新,但我想完全避免使用 SQL 以外的任何东西

4

1 回答 1

1

以下是更新值的方法,假设这是一次更新(如果不是,则每次Segments有任何更改时都必须运行它):

;WITH x AS 
(
  SELECT Invoice_ID, Routing = STUFF
  (
    (SELECT '-' + Depart + '-' + Arrival
      FROM dbo.Segments
      ORDER BY DepartDateTime
      FOR XML PATH(''), 
      TYPE).value(N'./text()[1]', N'varchar(max)'), 1, 1, '')
  FROM dbo.Segments
  GROUP BY Invoice_ID
)
UPDATE i SET Routing = x.Routing
  FROM dbo.Invoices AS i
  INNER JOIN x ON i.Invoice_ID = x.Invoice_ID;

Invoices更新后的内容:

PNR 发票_ID 路由
AAAAAA 1 DFW-MCIMCI-LAXLAX-DFW

如果您使用的是 SQL Server 2017 或更高版本,使用以下命令会容易得多STRING_AGG()

;WITH cte(rt, id) AS
(
  SELECT STRING_AGG(CONCAT_WS('-', Depart, Arrival), '')
         WITHIN GROUP (ORDER BY DepartDateTime), Invoice_ID
  FROM dbo.Segments GROUP BY Invoice_ID
)
UPDATE i SET i.Routing = cte.rt
FROM dbo.Invoices AS i 
INNER JOIN cte ON i.Invoice_ID = cte.id;
于 2012-07-02T22:47:32.997 回答