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

ルーティングと呼ばれる請求書に「DFW-MCI-LAX-DFW」という列があります。これはSQLのみの方法を使用して可能ですか?セグメントは順番にリストされているため、DFW-MCI、MCI-LAX、LAX-DFWの順になります。

編集:完全に許容できるDFW-MCI-MCI-LAX-LAX-DFWでデータベースを更新できれば。ビューレイヤーで重複するエントリを取り除くことができます。

これはColdFusionで簡単に書くことができますが、ループと何千ものデータベース更新には永遠に時間がかかります。100レコードごとに一括更新することもできますが、SQL以外のものは一切使用しないようにします。

4

1 に答える 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 Invoice_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 に答える