Tengo 3 tablas:

Vehicle: vehicle_id, vehicle_type
1, motorcycle
2, car
3, van

Owners: person_id, vehicle_id, date_bought
1, 1, 2009
1, 2, 2008
2, 3, 2009
2, 1, 2005

Quiero mostrar una lista de todos los vehículos de nombres. Si el person_id = 1, date_bought también debe ser devuelto.

Así que pensé que iba a comenzar con esto:

SELECT * FROM vehicles
LEFT JOIN Owners USING (vehicle_id)

que devuelve esto:

1, 1, motorcycle, 2009
1, 2, car, 2008
2, 3, van, 2009
2, 1, motorcycle, 2005

Sin embargo, ahora me pueden reducir esto a el resultado necesario. Si yo uso DISTINCT(car_id), no hay ningún cambio, como ya estoy eligiendo distintas coche ids antes de la combinación; sólo son no-diferentes después de la combinación. Si yo uso WHERE person_id = 1, me quito el pasado 2 de las filas y todas las referencias a la furgoneta se ha ido. Si yo uso GROUP BY car_id, la primera y la última fila se combinan, pero la date_bought para la motocicleta es elegido arbitrariamente. Lo que yo quiero es este:

1, 1, motorcycle, 2009
1, 2, car, 2008
 , 3, van, 

Necesito requieren una clara coche id, pero esto sucede antes de la combinación, y así no tiene ningún efecto en absoluto. ¿Cómo puedo obtener la singularidad con la combinación?

2 Comentarios

  1. 7

    Deberá incluir la restricción de identificación de la persona en su combinación y el uso de una combinación externa. Las combinaciones externas se utilizan cuando se desea que la información de retorno, incluso si no hay registros en la tabla que se va a unir a la. Trate de

    SELECT person_id, vehicles.* 
    FROM vehicles 
    LEFT OUTER JOIN Owners on vehicles.vehicle_id = owners.vehicle_id 
    and person_id = 1
    • Esto funciona perfectamente. Muchas gracias!
  2. 3

    Esto debe devolver lo que se ha incluido como salida esperada:

       SELECT DISTINCT
              o.person_id,
              v.vehicle_id,
              v.vehicle_type,
              o.date_bought
         FROM VEHICLES v
    LEFT JOIN OWNERS o ON o.vehicle_id = v.vehicle_id
    LEFT JOIN (SELECT t.vehicle_id,
                      MAX(t.date_bought) 'max_date_bought'
                FROM OWNERS t
            GROUP BY t.vehicle_id) x ON x.vehicle_id = o.vehicle_id
                                    AND x.max_date_bought = o.date_bought
        WHERE o.person_id IS NULL 
           OR o.person_id = 1

    Ser conscientes de que debido a la izquierda se unan, los PROPIETARIOS de las columnas devuelve NULL si no hay ninguna coincidencia vehicle_id en los PROPIETARIOS de la tabla.

Dejar respuesta

Please enter your comment!
Please enter your name here