2015-06-11 8 views
5

Ho questa tabella:Cerca riga specifica in un altro tavolo per data

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 

E questo:

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 

ho bisogno di aggiungere una nuova colonna alla old name e new name:

Ho provato questa query:

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 

Ma non ho potuto ottenere questo risultato:

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 

Tabella # BH2 ha la colonna detail, questa colonna è il Old name più il New name.

Ho bisogno dello old name e dello new name separati in due colonne, quindi userò la tabella BookingPassengerVersion con la cronologia delle modifiche.

Il nome è costituito dall'aggiunta di title, first name, middle name e last name.

+1

Troppo pigro per aggiungere una risposta, ma controlla questo link: [Come accedere alla riga precedente e successivo Valore della riga nell'istruzione SELECT?] (Http://blog.sqlauthority.com/2013/09/22/sql-server-how-to-access-the-previous-row-and-next-row-value-in- select-statement /) – MicSim

+1

Davvero non capisco la tua domanda. 'Ho bisogno di aggiungere una nuova colonna al vecchio nome e al nuovo nome:' non dice dove vuoi aggiungere. Hai bisogno di una query o vuoi aggiungere una colonna a una tabella? Per prima cosa devi dire quello che vuoi che la query restituisca. Inoltre ti suggerisco di creare il tuo schema in http://sqlfiddle.com/ che ci aiuterà a vedere ciò che hai –

+0

La tabella # BH2 ha la colonna dei dettagli, questa colonna è il vecchio nome più il nuovo nome. Ho bisogno che il vecchio nome e il nuovo nome siano separati in due colonne, quindi userò la tabella BookingPassengerVersion con la cronologia delle modifiche. Il nome si forma aggiungendo il titolo, il nome, il secondo nome e il cognome –

risposta

3

Puoi provare questo. SQL Fiddle

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 

EDIT ho aggiornato la query di unirsi di nuovo alla data anche e ottenere tutti gli aggiornamenti per tutte le prenotazioni

Aggiornamento New SQL Fiddle

Per filtrare il CTE dalle BookingID di in BH2 è possibile sia

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 
) 

oppure

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

si dovrebbe provare diverse cose quando si tratta di dataset di grandi dimensioni. Sostituirei anche la cte con una tabella temporanea e vedere se aiuta. controlla il tuo piano di esecuzione per vedere se hai bisogno anche di indici.

tabella temporanea invece di 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 
+1

Includo il Sql Fiddle nella tua domanda, penso che le righe di ritorno non siano ancora corrette. Non mostra ADM Change –

+1

grazie .. query updated .. se non stai filtrando questa query e userai tabelle con un lotto o righe. Vorrei prendere in considerazione l'utilizzo di una tabella temporanea o variabile di tabella per memorizzare il contenuto di cteBookingPassengerVersion. Ho riscontrato problemi di prestazioni utilizzando cte anziché tabelle temporanee in grandi database – JamieD77

+0

user1221684 ora funziona per tutte le prenotazioni, ma la tabella 'BookingPassengerVersion' contiene 259707998 record. 'WITH cteBookingPassengerVersion' deve essere limitato da BookingID. L'SQL non può completare la query –

2

si può provare questo in SqlFiddle ho aggiornare la risposta user1221684 per rimuovere le righe duplicate.

WITH cteBookingPassengerVersion AS 
(
    SELECT BookingID, 
      RTRIM(
       CONCAT (
        ISNULL(Title + ' ', ''), 
        ISNULL(FirstName + ' ', ''), 
        ISNULL(MiddleName + ' ', ''), 
        ISNULL(LastName, '') 
       ) 
      ) AS NAME, 
      AgentCode, -- add this line 
      ROW_NUMBER()OVER(PARTITION BY BookingID ORDER BY ModifiedDate DESC) rowNum 
    FROM BookingPassengerVersion WHERE BookingID = 196162093 
) 
SELECT cte.BookingID, 
     ctePrev.NAME AS OldName, 
     cte.NAME AS NewName, 
     bh.Detail, 
     bh.CreatedAgentCode, 
     bh.ChangeDate, 
     cte.rowNum, 
     ctePrev.rowNum 
FROM BH2 bh 
     JOIN cteBookingPassengerVersion cte ON (bh.BookingID = cte.BookingID and bh.CreatedAgentCode = cte.AgentCode) --Update this line 
     LEFT JOIN cteBookingPassengerVersion ctePrev ON ctePrev.rowNum = cte.rowNum + 1 
WHERE cte.rowNum <= 2 
+0

ho provato e ha funzionato, ma il 'BookingId' non può essere fissato, per ogni linea' BH2' è necessario per fare questo ...... quindi stavo cercando di usare il 'Cross Apply' –

+0

http://sqlfiddle.com/#!6/e20fb Ho incluso un altro ID –

0

Per questo schema SqlFiddle, il risultato atteso è:

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 
195668459 | MR CARLOS PERHARDT JUNIOR | MR CARLOS PERHARDT  | MR CARLOS PERHARDT JUNIOR MR CARLOS PERHARDT  | azbussmann  | 2015-01-06 16:36:28.323 

EDIT!

La soluzione finale, ho usato la risposta user1221684 creazione di una tabella temporanea per il'BookingPassengerVersion'

SELECT * 
    INTO #BPV 
    FROM 
     BookingPassengerVersion 
WHERE BookingID IN (SELECT DISTINCT BookingID FROM #BH2); 

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 #BPV 
) 
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 
+1

ho aggiornato la mia risposta originale. dovrebbe darti il ​​risultato che ti serve – JamieD77

+0

http://sqlfiddle.com/#!6/e20fb/4 – JamieD77

Problemi correlati