2012-03-13 7 views
16

Ho una domanda CTE filtrare una tabella Studentmultipla Selezionare l'uno contro l'CTE

Student 

    (
    StudentId PK, 
    FirstName , 
    LastName, 
    GenderId, 
    ExperienceId, 
    NationalityId, 
    CityId 
) 

Sulla base di un sacco di filtri (più città, genere, molteplici esperienze (1, 2, 3), più nationalites), I creare un CTE utilizzando SQL dinamico e unirsi al tavolo studente con un utente definito tabelle (CityTable, NationalityTable,...)

Dopo che devo recuperare il conteggio di studenti da ogni filtro come

CityId City Count 

NationalityId Nationality Count 

La stessa cosa dell'altro filtro.

Posso fare qualcosa di simile

;With CTE(
     Select 
     FROM Student 
     Inner JOIN ... 
     INNER JOIN ....) 
    SELECT CityId,City,Count(studentId) 
    FROm CTE 
    GROUP BY CityId,City 

    SELECT GenderId,Gender,Count 
    FROM CTE 
    GROUP BY GenderId,Gender 

voglio qualcosa di simile a ciò che LinkedIn sta facendo con la ricerca (ricerca persone, ricerca di lavoro)

http://www.linkedin.com/search/fpsearch?type=people&keywords=sales+manager&pplSearchOrigin=GLHD&pageKey=member-home

E 'così veloce e fare lo stesso cosa.

+4

NO. Un CTE è valido solo ** per la successiva (singola) istruzione **. Se è necessario "conservare" i dati, è necessario inserirli in un e.g. tabella variabile o tabella temporanea. –

+0

Questo è quello che sto già facendo. Il pb è che io filtro la tabella per mostrare solo alla fine solo 20 righe in un datagrid (top 21) + il gruppo by.it è lento con più join. –

risposta

12

Non è possibile utilizzare selezione multipla ma è possibile utilizzare più di un CTE come questo.

WITH CTEA 
AS 
(
SELECT 'Coulmn1' A,'Coulmn2' B 
), 
CETB 
AS 
(
SELECT 'CoulmnX' X,'CoulmnY' Y 
) 

SELECT * FROM CTEA, CETB 

Per ottenere il conteggio utilizzare RowNumber e CTE alcuni pensano in questo modo.

ROW_NUMBER() OVER (ORDER BY COLUMN NAME)AS RowNumber, 
Count(1) OVER() AS TotalRecordsFound 

Per favore fatemi sapere se avete bisogno di maggiori informazioni al riguardo.

Esempio per il vostro riferimento.

With CTE AS (
     Select StudentId, S.CityId, S.GenderId 
     FROM Student S 
     Inner JOIN CITY C 
     ON S.CityId = C.CityId 
     INNER JOIN GENDER G 
     ON S.GenderId = G.GenderId) 
, 
GENDER 
AS 
(
    SELECT GenderId 
    FROM CTE 
    GROUP BY GenderId 
) 


SELECT * FROM GENDER, CTE 
+0

Se inserisci codice, XML o campioni di dati, ** PLEASE ** evidenzia queste righe nell'editor di testo e fai clic sul pulsante "esempi di codice" ('{}') sulla barra degli strumenti dell'editor per formattarlo in modo appropriato e evidenziare la sintassi! –

+0

OKi.il risultato del codice mostra lo stesso numero di righe per la cte e il gruppo per.Voglio separarli. –

+0

Puoi fare qualcosa di simile in un 'VIEW'? Ho provato a ottenere un errore di sintassi. Penso che tu sia limitato a un solo CTE per visualizzazione. –

8

Non è possibile ottenere più set di risultati da un singolo CTE. È tuttavia possibile utilizzare una variabile di tabella per memorizzare nella cache alcune delle informazioni e di utilizzarla in seguito, invece di emettere la stessa query complesse più volte:

declare @relevantStudent table (StudentID int); 

insert into @relevantStudent 
select s.StudentID from Students s 
join ... 
where ... 

-- now issue the multiple queries 

select s.GenderID, count(*) 
from student s 
join @relevantStudent r on r.StudentID = s.StudentID 
group by s.GenderID 

select s.CityID, count(*) 
from student s 
join @relevantStudent r on r.StudentID = s.StudentID 
group by s.CityID 

Il trucco è quello di memorizzare solo le informazioni minime necessarie nella variabile di tabella.
Come con qualsiasi query se questo effettivamente migliorerà le prestazioni rispetto all'emissione delle query dipende in modo indipendente da molte cose (quanto è grande il set di dati variabili della tabella, quanto è complessa la query utilizzata per popolarlo e quanto sono complessi i successivi join/subselects contro la variabile di tabella, ecc.).

+0

Purtroppo questo non funzionerà con una vista. – MgSam

3

Fare un UNION ALL per fare più SELECT e concatenare i risultati insieme in una tabella.

;WITH CTE AS(
     SELECT 
     FROM Student 
     INNER JOIN ... 
     INNER JOIN ....) 
    SELECT CityId,City,Count(studentId),NULL,NULL 
     FROM CTE 
     GROUP BY CityId,City 
    UNION ALL 
    SELECT NULL,NULL,NULL,GenderId,Gender,Count 
     FROM CTE 
     GROUP BY GenderId,Gender 

Nota: I valori sopra NULL permettere appena i due risultati hanno colonne corrispondenti, in modo che i risultati possono essere concatenati.

Problemi correlati