Creación de una consulta SQL específica

Tengo tres mesas

    Employee    
    SSN Name
    1   a
    2   b
    3   c

    Projects    
    Pno Name
    1   x
    2   y
    3   z

    Works_On    
    ESSN    Pno
    1       1
    1       2
    2       1
    3       1
    3       2
    3       3

Bien, entonces la pregunta es, ¿cómo puedo saber (por consulta) qué empleado trabaja en TODOS los proyectos? Parece que no puedo comparar multi con multi.

Gracias y perdón por una pregunta tonta.

preguntado el 12 de junio de 12 a las 09:06

3 Respuestas

Una forma de hacerlo es contar todos los proyectos, contar la cantidad de proyectos por empleado y luego seleccionar todos los empleados que trabajan en la misma cantidad de proyectos:

DECLARE @ProjectCount int
SELECT @ProjectCount = Count(*) FROM Projects

SELECT e.* 
FROM Employee e
WHERE (SELECT COUNT(1) FROM Works_On w WHERE w.ESSN = e.SSN) = @ProjectCount

ProjectCount La variable está ahí para omitir proyectos de conteo para cada empleado.

ACTUALIZACIÓN: Cómo funciona:

Para cada empleado, cuente cuántos registros hay en Works_On mesa con campo ESSN igual al empleado actual SSN y luego compare ese número con el número total de proyectos. Consulta:

SELECT COUNT(1) FROM Works_On

le dará el número total de registros en Works_On tabla (6 en su caso). Queremos contar cuántos registros hay para cada empleado y es por eso que incrustamos esa consulta en nuestra consulta principal con la condición de seleccionar solo registros de Works_On tabla que tiene empleados actuales SSN. Si tuviera que escribir esto en algún lenguaje de programación, esto sería lógicamente equivalente a foreach bucle en la colección de empleados donde en el cuerpo del bucle selecciona todos los registros de Works_On tabla para el empleado actual y luego compárela con el número total de proyectos. Si el empleado actual tiene un número de proyectos igual al número total de proyectos, cuéntelo.

Espero que esto ayude.

Respondido el 12 de junio de 12 a las 21:06

definitivamente funciona!! Gracias, tuve que eliminar la variable que creaste para que funcione en mysql. ¿Puedes explicar cómo funciona? cuando ejecuto la consulta secundaria, me da 6 mientras que el recuento del proyecto es 3 - Shakir

Me alegro de poder ayudar. He ampliado la solución con una breve explicación. Si todavía tiene algunas preguntas, por favor pregunte. - Kosta

Prueba esto:

SELECT Employee.Name, Projects_On
FROM (
    SELECT Works_On.ESSN, COUNT(*) AS [Projects_On] 
    FROM [Works_On] INNER JOIN [Projects] ON Projects.Pno = Works_On.PNO 
    GROUP BY [ESSN]) A 

INNER JOIN Employee ON Employee.SSN = Essn
WHERE Projects_On = (SELECT COUNT(*) FROM Projects) 

No es la consulta más bonita que existe, pero parece funcionar.

Respondido el 12 de junio de 12 a las 09:06

trabajaría en count.

SELECT e.SSN
FROM Employee e,
     (SELECT w.ESSN, COUNT(*) AS count FROM Works_On w WHERE w.ESSN = e.SSN GROUP BY w.ESSN) wcount,
     (SELECT COUNT(*) AS count FROM Projects) p -- you can avoid this by calculating it before. 
WHERE wcount.ESSN = e.SSN
AND p.count = wcount.count

Respondido el 12 de junio de 12 a las 10:06

Tenía un pequeño error en él. lo he corregido ¿Puedes intentarlo ahora? - JHS

No es mi pregunta, pero recibo los siguientes errores: el identificador de varias partes "e.ESSN" no se pudo vincular. - lucasp

Sigo recibiendo: el identificador de varias partes "e.SSN" no se pudo vincular. - lucasp

sí, puedo confirmarlo, no funciona el mismo error que el anterior. parece una pregunta que no es tan fácil como parece jajaja - Shakir

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.