按日期搜索另一个表中的特定行

Lea*_*nce 5 sql sql-server

我有这张桌子:

SELECT * FROM #BH2

BookingID | Detail                                               | CreatedAgentCode | ChangeDate    
----------|------------------------------------------------------|------------------|--------------------------    
196162093 |  MRS LUCIENE CORREA correa MRS LUCIENE  CORREA       | lclisboa         | 2015-01-18 13:29:35.130
196162093 |  MRS LUCIENE CORREA LISBOA MRS LUCIENE CORREA correa | VOMATOS          | 2015-01-18 13:25:26.420
Run Code Online (Sandbox Code Playgroud)

还有这个:

SELECT * FROM BookingPassengerVersion WHERE BookingID = 196162093  ORDER BY ModifiedDate DESC

BookingID | Title | FirstName | MiddleName | LastName | AgentCode |  ModifiedDate     
----------|-------------------------------------------------------|----------------------------    
196162093 |  MRS  | LUCIENE   |            | CORREA   | lclisboa  | 2015-01-18 13:29:35.130
196162093 |  MRS  | LUCIENE   | CORREA     | correa   | VOMATOS   | 2015-01-18 13:25:26.420
196162093 |  MRS  | LUCIENE   | CORREA     | LISBOA   | ADM       | 2015-01-12 18:01:09.503
196162093 |  MRS  | LUCIENE   | CORREA     | LISBOA   | ADM       | 2015-01-12 18:01:05.227
Run Code Online (Sandbox Code Playgroud)

我需要一个新的列添加到old namenew name:

我试过这个查询:

BEGIN TRY DROP TABLE #FINAL_TABLE END TRY BEGIN CATCH END CATCH
SELECT DISTINCT
       BH.BookingID,
       -- S OldName,
       (CASE WHEN _NewName.Title>'' THEN _NewName.Title+' ' ELSE '' END)+_NewName.FirstName+' '+ _NewName.MiddleName+' '+_NewName.LastName AS NewName,            
       BH.CreatedAgentCode, 
       BH.ChangeDate,
INTO   #FINAL_TABLE 
FROM   #BH2 BH

CROSS APPLY
(
     SELECT TOP 2
            Title
            , FirstName
            , MiddleName
            , LastName 
        FROM BookingPassengerVersion
      WHERE BookingID   = BH.BookingID  
        AND BH.ChangeDate = ModifiedDate
     ORDER BY ModifiedDate DESC
) _NewName 
Run Code Online (Sandbox Code Playgroud)

但我无法得到这个结果:

BookingID | OldName                   | NewName                   | Detail                                              | CreatedAgentCode | ChangeDate    
----------|---------------------------|---------------------------|-----------------------------------------------------|------------------|--------------------------    
196162093 | MRS LUCIENE CORREA correa | MRS LUCIENE  CORREA       | MRS LUCIENE CORREA correa MRS LUCIENE  CORREA       | lclisboa         | 2015-01-18 13:29:35.130
196162093 | MRS LUCIENE CORREA LISBOA | MRS LUCIENE CORREA correa | MRS LUCIENE CORREA LISBOA MRS LUCIENE CORREA correa | VOMATOS          | 2015-01-18 13:25:26.420
Run Code Online (Sandbox Code Playgroud)

# BH2detail列,这列是Old name加号New name.

我需要old namenew name分成两列,所以我将使用BookingPassengerVersion具有更改历史记录的表.

名称是通过将所形成的title,first name,middle namelast name.

Jam*_*D77 2

你可以试试这个。SQL小提琴

WITH cteBookingPassengerVersion AS
(
    SELECT  BookingID,
            RTRIM(
                CONCAT (
                    ISNULL(Title + ' ', ''),
                    ISNULL(FirstName + ' ', ''),
                    ISNULL(MiddleName + ' ', ''),
                    ISNULL(LastName, '')
                )
            ) AS NAME,
            ModifiedDate,
            ROW_NUMBER()OVER(PARTITION BY BookingID ORDER BY ModifiedDate DESC) rowNum
     FROM   BookingPassengerVersion
)
SELECT  cte.BookingID,
        ctePrev.NAME AS OldName,
        cte.NAME AS NewName,
        bh.Detail,
        bh.CreatedAgentCode,
        bh.ChangeDate
FROM    BH2 bh
        JOIN cteBookingPassengerVersion cte ON bh.BookingID = cte.BookingID AND bh.ChangeDate = cte.ModifiedDate
        LEFT JOIN cteBookingPassengerVersion ctePrev ON ctePrev.BookingID = cte.BookingId AND ctePrev.rowNum = cte.rowNum + 1
ORDER BY cte.BookingID, bh.ChangeDate DESC
Run Code Online (Sandbox Code Playgroud)

编辑 我更新了查询以按日期加入并获取所有预订的所有更新

更新新的 SQL Fiddle

要通过 BH2 中的 BookingID 过滤 CTE,您可以执行以下操作:

WITH cteBookingPassengerVersion AS
(
    SELECT  BookingID,
            RTRIM(
                CONCAT (
                  ISNULLLL(Title + ' ', ''),
                    ISNULL(FirstName + ' ', ''),
                    ISNULL(MiddleName + ' ', ''),
                    ISNULL(LastName, '')
                )
            ) AS NAME,
            ModifiedDate,
            ROW_NUMBER()OVER(PARTITION BY BookingID ORDER BY ModifiedDate DESC) rowNum
     FROM   BH2
     JOIN   BookingPassengerVersion ON BH2.BookingID = BookingPassengerVersion.BookingID
)
Run Code Online (Sandbox Code Playgroud)

或者

WITH cteBookingPassengerVersion AS
(
    SELECT  BookingID,
            RTRIM(
                CONCAT (
                  ISNULLLL(Title + ' ', ''),
                    ISNULL(FirstName + ' ', ''),
                    ISNULL(MiddleName + ' ', ''),
                    ISNULL(LastName, '')
                )
            ) AS NAME,
            ModifiedDate,
            ROW_NUMBER()OVER(PARTITION BY BookingID ORDER BY ModifiedDate DESC) rowNum
     FROM   BookingPassengerVersion
     WHERE  BookingID IN (SELECT BookingID FROM BH2) 
)
Run Code Online (Sandbox Code Playgroud)

在处理大型数据集时,您应该尝试不同的方法。我什至会用临时表替换 cte,看看是否有帮助。检查您的执行计划,看看是否还需要任何索引。

临时表而不是 cte

SELECT  BookingID,
    RTRIM(
        CONCAT (
            ISNULLLL(Title + ' ', ''),
            ISNULL(FirstName + ' ', ''),
            ISNULL(MiddleName + ' ', ''),
            ISNULL(LastName, '')
        )
    ) AS NAME,
    ModifiedDate,
    ROW_NUMBER()OVER(PARTITION BY BookingID ORDER BY ModifiedDate DESC) rowNum
INTO   #bpv
FROM   BookingPassengerVersion
WHERE  BookingID IN (SELECT BookingID FROM BH2) 

SELECT  cte.BookingID,
        ctePrev.NAME AS OldName,
        cte.NAME AS NewName,
        bh.Detail,
        bh.CreatedAgentCode,
        bh.ChangeDate
FROM    BH2 bh
        JOIN #bpv cte ON bh.BookingID = cte.BookingID AND bh.ChangeDate = cte.ModifiedDate
        LEFT JOIN #bpv ctePrev ON ctePrev.BookingID = cte.BookingId AND ctePrev.rowNum = cte.rowNum + 1
ORDER BY cte.BookingID, bh.ChangeDate DESC
Run Code Online (Sandbox Code Playgroud)