2012-03-13 11 views
16

tengo una consulta CTE filtrar un estudiante tablaSelección múltiple contra un CTE

Student 

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

Sobre la base de un filtro de lote (varias ciudades, el género, las múltiples experiencias (1, 2, 3), múltiples nationalites), I crear un CTE mediante el uso de SQL dinámico y unirse a la mesa de estudiante con un definidos por el usuario (tablas) CityTable, NationalityTable,...

Después de que tengo que recuperar el recuento del estudiante por cada filtro como

CityId City Count 

NationalityId Nationality Count 

Lo mismo que el otro filtro.

¿Puedo hacer algo como

;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 

Quiero algo así como lo que LinkedIn está haciendo con la búsqueda (búsqueda de personas, la búsqueda de empleo)

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

Es tan rápido y hacer lo mismo cosa.

+4

NO. Un CTE es válido solo ** para el siguiente enunciado (único) **. Si necesita "preservar" los datos, debe ponerlos en, por ej. tabla variable o tabla temporal. –

+0

Eso es lo que ya estoy haciendo. El pb es que filtro la tabla para mostrar solo al final solo 20 filas en una cuadrícula de datos (top 21) + el grupo by.it es lento con varias uniones. –

Respuesta

12

No puede usar la selección múltiple pero puede usar más de un CTE como este.

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

SELECT * FROM CTEA, CETB 

Para obtener el conteo, use RowNumber y CTE algunos piensan así.

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

Háganme saber si necesita más información sobre esto.

Muestra para su referencia.

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

Si publica código, XML o muestras de datos, ** POR FAVOR ** resalte esas líneas en el editor de texto y haga clic en el botón "muestras de código" ('{}') en la barra de herramientas del editor para formatear y sintaxis ¡destaquelo! –

+0

OKi.el resultado de su código muestra el mismo número de filas para el cte y el grupo. Quiero separarlos. –

+0

¿Puedes hacer algo como esto en una 'VISTA'? Intenté y obtuve un error de sintaxis. Creo que estás limitado a solo un CTE por vista. –

8

No es posible obtener múltiples conjuntos de resultados desde un solo CTE. Sin embargo, puede utilizar una variable de tabla para almacenar en caché parte de la información y utilizarla más tarde en lugar de emitir la misma consulta compleja en múltiples ocasiones:

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 

El truco es almacenar sólo la información mínima requerida en la variable de tabla.
Como con cualquier consulta si esto mejorará el rendimiento frente a la emisión de las consultas depende de muchas cosas (qué tan grande es el conjunto de datos de la tabla, cuán compleja es la consulta usada para poblarla y cuán complejas son las siguientes uniones/subselecciones contra la variable de tabla, etc.).

+0

Lamentablemente, esto no funcionará con una vista. – MgSam

3

Realice un UNION ALL para hacer múltiples SELECT y concatene los resultados en una sola tabla.

;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: Los valores anteriores NULL acaba de permitir que los dos resultados que tienen columnas coincidentes, por lo que los resultados pueden ser concatenados.

Cuestiones relacionadas