1

我有一个SQL Server 2012具有唯一 TransactionID 的 TransactionMaster 表。LowTransaction、MediumTransaction 和 HighTransaction 表中将提供相同的 TransactionID。

对于 TransactionMaster 中的每个 TransactionID,我需要显示一个 StatusMessage。StatusMessage 可能来自 3 个表中的任何一个 - 基于从CRTDTECCRTTIME列制定的日期..

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)是合并连接所有涉及的四个表

;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 回答
0

我想你可以做这样的事情......

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

结果集

TransactionID   StatusMessage  CRTDTEC    CRTTIME
1               1  Low         20131213   235959
2               2  Low         20111213   235959
3               3 High         20140101   235959
于 2013-11-13T17:25:57.240 回答