2010-03-17 13 views
12

È possibile eseguire l'equivalente di un SINISTRO SINISTRO con sottoselezione dove sono richieste più colonne. Ecco cosa intendo.Utilizzo di subselect per eseguire LEFT JOIN

SELECT m.*, (SELECT * FROM model WHERE id = m.id LIMIT 1) AS models FROM make m 

Così com'è ora facendo questo mi dà un errore 'Operando dovrebbe contenere 1 colonna (s)'.

Sì, lo so che è possibile con LEFT JOIN, ma mi è stato detto che era possibile con subselect a Sono curioso di sapere come è fatto.

risposta

7

A una sottoselezione può essere restituita solo una colonna, quindi è necessaria una sottoselezione per ogni colonna che si desidera venga restituita dalla tabella del modello.

+0

posso effettivamente restituire più colonne in una selezione secondaria anche se non nel modo in cui voglio. Questa query restituisce più colonne. SELEZIONA m. *, Modelli. * FROM make m, (SELEZIONA * FROM modello LIMIT 1) Modelli AS – Andre

+1

Le sottoquery possono restituire più di una colonna da FROM e JOIN, poiché si sta lavorando con le righe in tale contesto. Dal momento che lavori solo con gli scalari nel contesto SELECT puoi solo restituire un valore da una sottoquery. – MisterZimbu

+0

concordato. Grazie. – Andre

16

Ci sono molti usi pratici per ciò che suggerisci.

Questo ipotetico interrogazione restituisce il più recente release_date (esempio forzato) per qualunque marca con almeno un release_date e nullo per qualsiasi marca senza release_date:

SELECT m.make_name, 
     sub.max_release_date 
    FROM make m 
     LEFT JOIN 
      (SELECT id, 
        max(release_date) as max_release_date 
       FROM make 
      GROUP BY 1) sub 
     ON sub.id = m.id