2009-04-22 12 views
17

Estoy ejecutando la siguiente consulta:MySQL sentencia devuelve más de una fila

SELECT 
    voterfile_county.Name, 
    voterfile_precienct.PREC_ID, 
    voterfile_precienct.Name, 
    COUNT((SELECT voterfile_voter.ID 
FROM voterfile_voter 
JOIN voterfile_household 
WHERE voterfile_voter.House_ID = voterfile_household.ID 
AND voterfile_household.Precnum = voterfile_precienct.PREC_ID)) AS Voters 
FROM voterfile_precienct JOIN voterfile_county 
WHERE voterfile_precienct.County_ID = voterfile_County.ID; 

que estoy tratando de hacerlo volver algo como esto:

County_Name Prec_ID Prec_Name Voters(Count of # of voters in that precienct) 

Sin embargo, estoy consiguiendo el error:

#1242 - Subquery returns more than 1 row.

He intentado colocar la declaración COUNT en la subconsulta pero obtengo una sintaxis no válida er ror.

+0

@ Dropped.on.Caprica deja de ser listo. Esta información es pública. Puede obtenerlo usted mismo para fines de aprendizaje. – Eimantas

+0

@Eimantas Su historial de preguntas y comentarios sobre la respuesta parecen sugerir lo contrario. De cualquier manera, he terminado. –

Respuesta

13

se puede probar sin la subconsulta, con un simple grupo de:

SELECT voterfile_county.Name, 
    voterfile_precienct.PREC_ID, 
    voterfile_precienct.Name, 
    count(voterfile_voter.ID) 
FROM voterfile_county 
JOIN voterfile_precienct 
    ON voterfile_precienct.County_ID = voterfile_County.ID 
JOIN voterfile_household 
    ON voterfile_household.Precnum = voterfile_precienct.PREC_ID 
JOIN voterfile_voter 
    ON voterfile_voter.House_ID = voterfile_household.ID 
GROUP BY voterfile_county.Name, 
    voterfile_precienct.PREC_ID, 
    voterfile_precienct.Name 

Cuando se utiliza GROUP BY, cualquier columna que no está agrupando debe tener una cláusula agregada (fe SUM o COUNT.) Por lo tanto, en este caso, debe agrupar el nombre del condado, precienct.id y precient.name.

+0

que funcionó, tomó 92.5746 segundos para ejecutar y devolver el conjunto de resultados. ¿Alguna idea sobre cómo acelerar eso? – gsueagle2008

+0

¿Tiene claves foráneas para las relaciones? Eso podría ayudar. – Andomar

+0

agregue índices para todas las columnas utilizadas en las uniones para acelerarlo. Si el conjunto de resultados es grande, cualquier cosa que haga para hacerlo más pequeño también lo acelerará. –

3

Prueba este

SELECT 
voterfile_county.Name, voterfile_precienct.PREC_ID, 
voterfile_precienct.Name, 
    (SELECT COUNT(voterfile_voter.ID) 
    FROM voterfile_voter JOIN voterfile_household 
    WHERE voterfile_voter.House_ID = voterfile_household.ID 
     AND voterfile_household.Precnum = voterfile_precienct.PREC_ID) as Voters 
FROM voterfile_precienct JOIN voterfile_county 
ON voterfile_precienct.County_ID = voterfile_County.ID 
+0

solo dice que la consulta se está ejecutando, que está más lejos de lo que he obtenido. pero no dados – gsueagle2008

+0

Intenta cambiar la unión, voy a actualizar –

+0

, todavía cuelga. – gsueagle2008

59

Si obtiene el error: error no 1242 Subquery devuelve más de una fila, intente poner ANY antes de su subconsulta. Por ejemplo:

Esta consulta de error de retorno:

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2); 

Esta es una buena consulta:

SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2); 
+1

Esto es exactamente lo que necesitaba para mi problema. ¡GRACIAS! –

+6

¿Por qué column1 = ANY (subquery) funciona y no column1 IN (subconsulta)? ¿No recrea la misma lógica relacional? – Prusprus

+0

Esto resolvió mi problema con la actualización de filas en función de una declaración de selección de la misma tabla. – Patrick

3

Véase el siguiente ejemplo y modificar su consulta en consecuencia.

select COUNT(ResultTPLAlias.id) from 
(select id from Table_name where ....) ResultTPLAlias; 
Cuestiones relacionadas