简体   繁体   中英

Select one records from three tables based on latest date

I have a TransactionMaster table in SQL Server 2012 that has unique TransactionID. The same TransactionID wil be availabe in LowTransaction ,MediumTransaction and HighTransaction tables.

For each TransactionID in TransactionMaster, I need to display one StatusMessage. The StatusMessage may come from any of the 3 tables - based on date formulated from CRTDTEC and CRTTIME columns..

What is the best way in SQL Server 2012 to select the StatusMessage corresponding to latest date?

Note: CRTDTEC Format - YYMMDD and CRTTIME Format - HHMMSS

CODE

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')

Expected Result

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

The simplest way would probably be

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 

Or another possibility (if there is a covering index ordered by TransactionID on all tables) would be to merge join all four tables involved

;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 

I guess you could do something like this...

SELECT TransactionID, StatusMessage, CRTDTEC,   CRTTIME  
FROM
  (
    SELECT *, rn =  ROW_NUMBER() OVER (PARTITION BY TransactionID ORDER BY CRTDTEC DESC) 
    FROM 
    (
    SELECT *    FROM @LowTransaction
    UNION ALL
    SELECT *    FROM @MediumTransaction
    UNION ALL
    SELECT *    FROM @HighTransaction
    )q
  ) q2
WHERE rn = 1

Result Set

TransactionID   StatusMessage  CRTDTEC    CRTTIME
1               1  Low         20131213   235959
2               2  Low         20111213   235959
3               3 High         20140101   235959

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM