2012-04-10 11 views
5

voy sobre un papel pasado por un curso de base de datos que voy, y estoy atascado en una pregunta SQL¿Cómo escribir una consulta "exclusiva" en SQL?

Aquí es el esquema proporcionado

  • País (nombre, capital, área), nombre es la clave

  • personas (país, población, niños, adultos), donde el país se refiere al nombre en el país, la población es la población total, y los niños y adultos es el porcentaje de la población infantil y adulta.

  • Idioma (país, idioma, porcentaje): para cada idioma que se habla en el país , enumera el porcentaje de la población que habla el idioma.

aquí está la pregunta:

Escribe la siguiente consulta en SQL: Encuentra idiomas que se solamente hablan en los países cuya población total supera 10^7.

Esto es lo que tengo hasta ahora:

SELECT l.language 
FROM people p, language l 
WHERE l.country = p.country AND 
    p.population > 10^7 

El bit Me gustaría saber es cómo comprobar que no existen otros países que una lengua se habla en pero la población es menor de 10^7.

¿Algún consejo? Gracias

+0

Dado que esto es para un DB c sin embargo, debe leer sobre la sintaxis de unión correcta. Lo que está usando es una notación más antigua/obsoleta (pero aún funcional), y la llamo "sintaxis diferida". –

+0

"Sólo más de X" significa "Ninguna menos que X" –

+0

Una cosa truculenta (que creo que esta pregunta está llegando) es, para cualquier idioma, pregúntate: ¿en cuántos países se habla, y ¿Cuántos de esos países tienen> X población? O podría preguntarse a sí mismo: "Si tuviera dos tablas, una con población de países> X, la otra

Respuesta

4

Obtenga todos los idiomas. De ese conjunto, elimine todos los idiomas que se hablan en países con población < = 10^7. El recordatorio debe ser solo idiomas hablados en países con población> 10^7.

select language from languages 
where language not in (
    select language from languages l 
    join people p on l.country = p.country 
    where p.population <= 10^7) 

Esto funciona sobre la base de que su diseño tiene la restricción de que cada lengua tiene que ser hablado en por lo menos un país;)

+0

Esta es una forma, pero una forma que (en mi experiencia limitada) * no * se enseña como la solución clásica/académica porque usa una selección secundaria. –

+0

"Esto funciona sobre la base de que ..." - ¡No creo que sea una suposición segura! – onedaywhen

+1

Si quiere una solución sin una subconsulta, use MINUS para combinar dos SELECT. –

1
WITH T 
    AS 
    (
     SELECT l.language, 
      p.country, p.population 
     FROM people p, language l 
     WHERE l.country = p.country 
    ) 
SELECT language 
    FROM T 
EXCEPT 
SELECT language 
    FROM T 
WHERE population <= 10000000; 

alternativa:

SELECT language 
    FROM language AS l1 
WHERE 10000000 < (SELECT MIN(p.population) 
         FROM people p, language l 
        WHERE l.country = p.country 
          AND l.language = l1.language); 

mismo modo:

SELECT language 
    FROM language AS l1 
WHERE 10000000 < ALL (SELECT p.population 
          FROM people p, language l 
         WHERE l.country = p.country 
           AND l.language = l1.language); 
Cuestiones relacionadas