sql join возвращает ноль, если значение не найдено - PullRequest
8 голосов
/ 31 января 2012

У меня есть таблица со странами, курортами и фотографиями для курортов. Каждая фотография может быть помечена как название для альбома. Я хочу выбрать объединенный набор данных с идентификатором страны и именем, идентификатором курорта и именем и фотографией, только если он помечен как заголовок, в противном случае - ноль.

Я пытался сделать следующее:

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 s.inc=@country_id

И у меня есть список всех фотографий - под названием и нет. Если я добавлю filering с помощью is_title filed ('and p.is_title = 1'), все курорты, которые не имеют названия фотографий, будут отброшены из результирующей базы данных, а не того, что я хочу.

Я просто хочу получить что-то вроде (см. Последний ряд):

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

1 Ответ

18 голосов
/ 31 января 2012

Включите дополнительные предикаты в условие JOIN, а не в предложение WHERE, чтобы они не приводили к удалению всей строки:

LEFT OUTER JOIN dbo.resorts_photo AS p
ON p.resort_id = t.inc
AND p.is_title = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...