SQL Server — Как выполнить внутреннее соединение, когда условие может быть пустым?

#sql #sql-server #left-join #inner-join #where-clause

#sql #sql-server #левое соединение #внутреннее соединение #where-предложение

Вопрос:

Я пытаюсь получить страну из адреса моей фабрики напрямую в одном запросе с внутренним соединением. Моя проблема в том, что AddressID может быть пустой строкой.

Как мне это проверить и сделать какое-то исключение или что-то подобное? I если идентификатор адреса пуст, мне нужна пустая строка в качестве результата для f.Country.

На данный момент это мой запрос, но если AddressID = «, то строка не отображается в моем результате.

 SELECT o.FactoryID,o.Name,o.Rating,o.ProductCategory,o.Emissions,o.LatestChanges,o.AddressID,o.ProductTags,f.Country 
FROM FactoryHistory o
INNER JOIN AddressHistory f on f.AddressID = o.AddressID
WHERE NOT o.LatestChanges = 'Deleted' AND o.IsCurrent = 1 AND f.IsCurrent = 1
  

Я что-то в моем вопросе отсутствует или неясно, просто дайте мне знать!

Ответ №1:

Просто left join :

 SELECT o.FactoryID, o.Name, o.Rating, o.ProductCategory, o.Emissions, o.LatestChanges, o.AddressID, o.ProductTags, f.Country 
FROM FactoryHistory o
LEFT JOIN AddressHistory f on f.AddressID = o.AddressID AND f.IsCurrent = 1
WHERE NOT o.LatestChanges = 'Deleted' AND o.IsCurrent = 1
  

Если вы все еще хотите отфильтровать фабрики, которых AddressID нет null (предполагая, что под пустым вы подразумеваете null ) и которые не существуют в таблице адресов, вы можете добавить условие в WHERE предложение:

 WHERE 
    NOT o.LatestChanges = 'Deleted' 
    AND o.IsCurrent = 1 
    AND (o.AddressID IS NULL OR f.AddressID IS NOT NULL)
  

Это может быть понятнее с отрицанием:

 WHERE 
    NOT o.LatestChanges = 'Deleted' 
    AND o.IsCurrent = 1 
    AND NOT (o.AddressID IS NOT NULL AND f.AddressID IS NULL)