2009-04-22 12 views
17

sto eseguendo questa query:MySQL sottoquery restituisce più di una riga

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; 

sto cercando di farlo tornare qualcosa di simile:

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

Tuttavia, sto ottenendo l'errore:

#1242 - Subquery returns more than 1 row.

Ho provato a inserire l'istruzione COUNT nella sottoquery ma ottengo una sintassi non valida er ror.

+0

@ Dropped.on.Caprica smette di essere furbo. Questi dati sono pubblici. Puoi averlo da solo per scopi di apprendimento. – Eimantas

+0

@Eimantas La sua storia di domande e commenti sulla risposta sembrano suggerire il contrario. Ad ogni modo, ho finito. –

risposta

13

si può provare senza il subquery, con un semplice gruppo da:

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 

Quando si utilizza GROUP BY, una colonna che non esegue il raggruppamento deve avere una clausola aggregata (fe SUM o COUNT.) Quindi in questo caso devi raggruppare il nome della contea, precienct.id e precient.name.

+0

che ha funzionato, ci sono voluti 92,5746 secondi per eseguire e restituire il set di risultati però. qualche idea su come accelerarlo? – gsueagle2008

+0

Hai chiavi straniere per le relazioni? Questo potrebbe aiutare. – Andomar

+0

aggiungi indici per tutte le colonne utilizzate nei join per velocizzarlo. Se il set di risultati è grande, tutto ciò che fai per renderlo più piccolo lo accelera. –

3

Prova questa

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

dice solo che la query è in esecuzione, che è più lontana di quanto ho ottenuto. ma niente da fare. – gsueagle2008

+0

Prova a cambiare il join, aggiornerò –

+0

è ancora appena riagganciato. – gsueagle2008

59

In caso di errore: errore 1242 Sottoquery restituisce più di una riga, provare a mettere QUALSIASI prima della sottoquery. Ad esempio:

Questo errore di ritorno interrogazione:

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

Questa è una buona domanda:

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

Questo è esattamente ciò di cui avevo bisogno per il mio problema. GRAZIE! –

+6

Perché column1 = ANY (subquery) funziona e non column1 IN (subquery)? Non ricrea la stessa logica relazionale? – Prusprus

+0

Questo ha risolto il mio problema con l'aggiornamento delle righe in base a un'istruzione select dalla stessa tabella. – Patrick

3

si veda l'esempio qui sotto e modificare di conseguenza la query.

select COUNT(ResultTPLAlias.id) from 
(select id from Table_name where ....) ResultTPLAlias; 
Problemi correlati