2012-01-31 25 views
6

Tengo una tabla con países, centros turísticos y fotos para centros turísticos. Cada foto puede ser marcada como título para el álbum. Deseo seleccionar el conjunto de datos unido con el ID y el nombre del país, el id del complejo y el nombre y la foto solo si está marcado como título, de lo contrario, nulo.sql join return null si no se encuentra el valor

he tratado de hacer lo siguiente:

select 
    s.id as c_id, 
    s.name as c_name, 
    t.id as r_id, 
    t.name as r_name, 
    p.thumbnail as image, 
    p.description as desc, 
    p.is_title 
from dbo.countries s 
join dbo.resorts t on t.state=s.inc 
left outer join dbo.resorts_photo p on p.resort_id=t.inc 
where [email protected]_id 

y la lista de todas las fotos que tengo - titulado y no. Si agrego filering por is_title archivado ('y p.is_title = 1'), todos los centros turísticos que no tengan una foto titulada serán eliminados de los datos de resultados, no es lo que deseo.

sólo quiero conseguir algo como (véase la última fila):

c_id c_name  r_id r_name image desc is_title 
2 Australia 17 Adelaida 0xXXXX NULL 1 
2 Australia 178 BB Rief 0xXXXX blah 1 
2 Australia 160 Brum  NULL NULL NULL 

Respuesta

16

Incluir el predicado extra (s) en su condición de unión en lugar de la cláusula WHERE para que no causan toda la fila de ser eliminado:

LEFT OUTER JOIN dbo.resorts_photo AS p 
ON p.resort_id = t.inc 
AND p.is_title = 1 
Cuestiones relacionadas