2012-09-17 23 views
8

El objetivo de mi consulta es devolver el nombre del país y su jefe de estado si su headofstate tiene un nombre que comienza con A, y el capital del país tiene más de 100.000 personas que utilizan una consulta anidada.Anidamiento de consultas en SQL

Aquí es mi consulta:

SELECT country.name as country, 
     (SELECT country.headofstate 
     from country 
     where country.headofstate like 'A%')  
from country, city 
where city.population > 100000; 

He intentado darle la vuelta, colocándola en la cláusula where etc. No entiendo consultas anidadas. Solo estoy recuperando errores, como "subconsulta devuelve más de una fila" y tal. Si alguien me puede ayudar con cómo ordenarlo y explicar por qué debe ser de cierta manera, sería genial.

Respuesta

15

Si tiene que ser "anidados", esto sería una manera, a hacer su trabajo:

SELECT o.name AS country, o.headofstate 
FROM country o 
WHERE o.headofstate like 'A%' 
AND (
    SELECT i.population 
    FROM city i 
    WHERE i.id = o.capital 
    ) > 100000 

A JOIN sería más eficiente que una subconsulta correlacionada, sin embargo. ¿Puede ser que quien te dio esa tarea no se apresure a sí mismo?

+0

Si uso este tipo de consultas sql, entonces me muestra el error como se muestra a continuación . Operando debe contener 1 columna (s) que me puede ayudar .... Mi consulta SQL es s SELECT. * DE j5749_faculty_subjects como S DONDE s.subjectid = '1' Y ( \t \t seleccionar una. * \t \t dE j5749_facultyavailablity como \t \t DONDE a.facultyid = s.facultyid Y a.timeid = '3' ) – Amit

+0

@amit: Ver la última parte en mi consulta: '> 100000'. No tienes equivalente. Probablemente quieras 'EXISTS'. [Vea este ejemplo.] (Http://stackoverflow.com/questions/14251180/find-records-where-join-doesnt-exist/14260510#14260510) De lo contrario, comience una * nueva pregunta * con todos los detalles. –

7

Es necesario join las dos tablas y luego filtrar el resultado en where cláusula:

SELECT country.name as country, country.headofstate 
from country 
inner join city on city.id = country.capital 
where city.population > 100000 
and country.headofstate like 'A%' 
+0

Gracias por su ayuda nuevamente! Y aunque esto funciona perfectamente, y tiene sentido, se supone que estoy usando consultas anidadas. ¿Tienes una alternativa? – ZAX

+1

@ZAX si necesita una consulta anidada, eche un vistazo a mi respuesta ... :-) – aleroot

+2

@ZAX Atrévete pregunta por qué, en la tierra, estás ** supuesta ** para usar consultas anidadas? ¿Es esta tarea? Debido a que las consultas anidadas ni siquiera son la mejor solución para este problema –

0

De la forma en que lo veo, el único lugar para una consulta anidada sería en la cláusula WHERE, por ejemplo,

SELECT country.name, country.headofstate 
FROM country 
WHERE country.headofstate LIKE 'A%' AND 
country.id in (SELECT country_id FROM city WHERE population > 100000) 

Aparte de eso, tengo que estar de acuerdo con Adrian en: ¿por qué diablos se debe utilizar consultas anidadas?

1

La siguiente consulta debería ayudarlo a lograr lo que desea.

select scountry, headofstate from data 
where data.scountry like 'a%'and ttlppl>=100000