1

SQL Server 2012一意の TransactionID を持つTransactionMaster テーブルがあります。LowTransaction 、MediumTransaction および HighTransaction テーブルで同じ TransactionID を使用できます。

TransactionMaster の各 TransactionID に対して、1 つの StatusMessage を表示する必要があります。CRTDTECStatusMessage は、作成された日付とCRTTIME列に基づいて、3 つのテーブルのいずれかから取得される場合があります。

SQL Server 2012最新の日付に対応する StatusMessage を選択する最良の方法は何ですか?

注: CRTDTEC 形式 -YYMMDD および CRTTIME 形式 -HHMMSS

コード

DECLARE @TransactionMaster TABLE (TransactionID INT)

DECLARE @LowTransaction TABLE (TransactionID INT, StatusMessage VARCHAR(80), CRTDTEC VARCHAR(8), CRTTIME VARCHAR(6))
DECLARE @MediumTransaction TABLE (TransactionID INT, StatusMessage VARCHAR(80), CRTDTEC VARCHAR(8), CRTTIME VARCHAR(6))
DECLARE @HighTransaction TABLE (TransactionID INT, StatusMessage VARCHAR(80), CRTDTEC VARCHAR(8), CRTTIME VARCHAR(6))

INSERT INTO @TransactionMaster VALUES (1)
INSERT INTO @TransactionMaster VALUES (2)
INSERT INTO @TransactionMaster VALUES (3)

INSERT INTO @LowTransaction VALUES (1,'1  Low','20131213','235959')
INSERT INTO @MediumTransaction VALUES (1,'1','20131213','235900')
INSERT INTO @HighTransaction VALUES (1,'1 High','20111213','235959')

INSERT INTO @LowTransaction VALUES (2,'2  Low','20111213','235959')

INSERT INTO @LowTransaction VALUES (3,'3 Low','20111213','235959')
INSERT INTO @MediumTransaction VALUES (3,'3 Medium','20111213','235959')
INSERT INTO @HighTransaction VALUES (3,'3 High','20140101','235959')

期待される結果

(1,'1  Low','20131213','235959')
(2,'2  Low','20111213','235959')
(3,'3 High','20140101','235959')
4

2 に答える 2

2

最も簡単な方法はおそらく

WITH TransConsolidated
     AS (SELECT *
         FROM   @LowTransaction
         UNION ALL
         SELECT *
         FROM   @MediumTransaction
         UNION ALL
         SELECT *
         FROM   @HighTransaction)
SELECT TM.TransactionID,
       CA.*
FROM   @TransactionMaster TM
       CROSS APPLY (SELECT TOP 1 *
                    FROM   TransConsolidated TC
                    WHERE  TC.TransactionID = TM.TransactionID
                    ORDER  BY CRTDTEC DESC,
                              CRTTIME DESC) CA 

または、別の可能性 (TransactionIDすべてのテーブルで順序付けられたカバリング インデックスがある場合) は、関連する 4 つのテーブルすべてをマージ結合することです。

;WITH CTE
     AS (SELECT TM.TransactionID,
                MAX(CA.CRTDTEC + CA.CRTTIME + CA.StatusMessage) AS MaxRow
         FROM   @TransactionMaster TM
                LEFT MERGE JOIN @LowTransaction LT
                  ON LT.TransactionID = TM.TransactionID
                LEFT MERGE JOIN @MediumTransaction MT
                  ON MT.TransactionID = TM.TransactionID
                LEFT MERGE JOIN @HighTransaction HT
                  ON HT.TransactionID = TM.TransactionID
                CROSS APPLY (SELECT LT.*
                             UNION ALL
                             SELECT MT.*
                             UNION ALL
                             SELECT HT.*) CA
         GROUP  BY TM.TransactionID)
SELECT TransactionID,
       SUBSTRING(MaxRow, 1, 8),
       SUBSTRING(MaxRow, 9, 6),
       SUBSTRING(MaxRow, 16, 80)
FROM   CTE 
于 2013-11-13T17:23:02.837 に答える