2013-06-03 14 views
6

voglio ottenere questo tipo di risultato utilizzando MS SQLCome ottenere il numero di riga basata su campo unico e allineati secondo un altro campo

PAGE 1 
ID  Research Title  Published Date Author ID Author Name 
1  Research A   2013-5-10   D567   John 
1  Research A   2013-5-10   D568   Stan 
2  Research B   2013-5-9   D569   Steve 
3  Research C   2013-5-8   D570   Michael 

PAGE 2 
ID  Research Title  Published Date Author ID Author Name 
4  Research D   2013-5-8   D567   John 
5  Research F   2013-5-7   D570   Michael 
5  Research F   2013-5-7   D568   Stan  
5  Research F   2013-5-7   D569   Steve  
6  Research E   2013-5-6   D569   Steve 

Il risultato è una combinazione di 3 Tabella

Tabella "Ricerca "che contiene tutti i dati di ricerca

------ TABLE Research------ 
- ResearchID Uniqueidentifier 
- ResearchTitle text 
- PublishedDate 

Tabella 'Autore' che contiene tutti i dati docente

------ TABLE Author ------ 
- AuthorID varchar(20) 
- AuthorName vachar(100) 

E, tabella "ResearchAuthorMapping" che creano relazione tra "ricerca" e "Autore"

------ TABLE ResearchAuthorMapping------ 
- ResearchID uniqueidentifier  
- AuthorID varchar(20) 

Ecco la mia domanda finora

DECLARE @offset int; 
DECLARE @limit int = 3; 
DECLARE @page int = 1 -- CHANGE BY REQUEST 
SET @offset = ((@page - 1) * @limit) + 1; 
SELECT * 
FROM 
(
    SELECT 
     DENSE_RANK() OVER(ORDER BY Research.ResearchTitle DESC) AS num, 
     Research.* 
    FROM 
     Research 
     LEFT JOIN 
      ResearchAuthorMapping ON Research.ResearchID = ResearchAuthorMapping.ResearchID 
     LEFT JOIN 
      Author ON ResearchAuthorMapping.AuthorID = Author.AuthorID 

)TempTable 
WHERE 
    TempTable.num >= @Offset AND TempTable.num < @offset + @limit 

Fino ad ora, sono solo in grado di raggiungere questo

PAGE 1 
ID  Research Title  Published Date Author ID Author Name 
1  Research F   2013-5-7   D570   Michael 
1  Research F   2013-5-7   D568   Stan 
1  Research F   2013-5-7   D569   Steve  
2  Research E   2013-5-6   D569   Steve  
3  Research D   2013-5-8   D567   John 

PAGE 2 
ID  Research Title  Published Date Author ID Author Name 
4  Research C   2013-5-8   D570   Michael 
5  Research B   2013-5-9   D569   Steve 
6  Research A   2013-5-10   D567   John 
6  Research A   2013-5-10   D568   Stan 

Un set di risultati che è ordinato da Research Titolo,

.210

Ma, quello che voglio è i dati in ordine di data di pubblicazione, ma ottenere l'ID basa su

ResearchTitle/ResearchID raggruppamento (nella mia domanda io ottenere l'ID utilizzando DENSE_RANK). Io uso la ID per limitare il risultato (impaginazione)

* Ci scusiamo per il mio cattivo inglese

+2

Benvenuti in StackOverflow, la tua domanda è ottima, molto codice, design della tabella, dati di esempio. Quale versione di SQL stai usando? Ci sono alcune differenze tra loro. – Yaroslav

+1

Ciao Yaroslav, grazie .. Sto usando SQL server 2008 R2 – Denitri

risposta

2

ho recon si potrebbe avvolgere i risultati in una serie row_number che ri-ordini i primi risultati. Qualcosa sulla falsariga di:

SELECT * 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY PublishedDate) AS rownum 
        ,A.* 
      FROM  (SELECT DENSE_RANK() OVER (ORDER BY Research.ResearchTitle DESC) AS num 
           ,ResearchID 
           ,PublishedDate 
         FROM  Research) A) B 
LEFT JOIN ResearchAuthorMapping C 
ON  B.ResearchID = C.ResearchID 
LEFT JOIN Author D 
ON  C.AuthorID = D.AuthorID 
WHERE B.rownum >= @Offset 
     AND B.rownum < @offset + @limit 

Ho spostato i join all'esterno della sottoquery per limitare le ricerche.

+0

hi souplex. Non ho provato la tua soluzione. mal provarlo al più presto, ma vedendo la tua soluzione è sicuro usare 3 selezioni annidate? perché i dati che sto lavorando erano molto grandi. Grazie. – Denitri

+0

Non posso davvero rispondere a quello Denitri, perché avrei bisogno di sapere molto di più sul tuo caso. Ma in generale, quando il set di dati è molto grande, la mia versione della query sarebbe leggermente più leggera perché i 2 join vengono applicati solo alla pagina limitata. La funzione row_number non è particolarmente pesante, ma "order by" potrebbe essere molto costosa. – souplex

+0

hi souplex, sono d'accordo che la tua domanda è stata più chiara mettendo il join all'esterno. Ma ho provato la tua soluzione, ma purtroppo non soddisfa il mio obiettivo. il motivo per cui ho inserito i join nel risultato iniziale è stato perché ho bisogno di filtrare i dati che sono stati recuperati dalla tabella di ricerca (nella tabella delle query A). Quindi da quel risultato filtrato voglio creare l'impaginazione, questo è il motivo per cui ho bisogno del numero di riga basato sul campo ResearchID in modo da poter limitare il risultato usando la condizione esterna (dove rownum> = @offset ...) – Denitri

Problemi correlati