#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)