2016-09-15 4 views
-1

Я хочу получить ровно одну строку с car данными с carName и значениями, если они существуют, для makerName и plateNumber этого автомобиля.Проблема в соединении, когда некоторые поля пустые

Например, Ford Taurus, Ford, 4AD843.

Если по какой-то причине Ford Taurus не имеет номерной знак, я хочу, чтобы получить эту одну строку без значения в столбце номера плиты, например

Ford Taurus, Ford, null. 

Я попытался sql ниже, но я получить все значения для всех таблиц maker и license, а если добавить к статье where ограничения для car.id в таблицах maker и license я получаю 0 строк, если значение в license является null.

Как это можно сделать?

Что я пробовал:

select 
    car.id as carID, 
    maker.carId as makerCarId, maker.name as makerName, 
    license.carId as licenseCarId, license.plateNumber as plateNumber 
from 
    car car, 
    maker maker, 
    license license 
    where car.id = 4951 
; 
+0

Переключитесь на современный явный синтаксис JOIN. Легче писать (без ошибок), легче читать и проще конвертировать в внешнее соединение, если это необходимо. – jarlh

+0

Где находятся условия для соединения таблиц. Вы получаете перекрестный продукт – Jens

ответ

1

Вы должны использовать SQL LEFT JOIN ключевое слово, которое возвращает все строки из левой таблицы (car) , с соответствующими строками в правой таблице (maker или license). Результат игры: NULL справа.

SELECT car.id AS carID 
    , maker.name AS makerName 
    , license.plateNumber AS plateNumber 
FROM car AS car 
LEFT JOIN maker AS maker ON car.id = maker.carId 
LEFT JOIN license AS license ON car.id = license.carId 
WHERE car.id = 4951 
0

Похоже, вы ищете left join:

SELECT 
    car.id AS carID, 
    maker.carId AS makerCarId, maker.name AS makerName, 
    license.carId AS licenseCarId, license.plateNumber AS plateNumber 
FROM 
    car 
JOIN 
    maker ON car.id = maker.carId 
LEFT JOIN 
    license ON car.id = license.carId 
where car.id = 4951 
0

Результатом вашего запроса является декартовое соединение между столами автомобилей, изготовителем и лицензией. Это приведет к тому, что все строки имеют идентификатор автомобиля, указанный в предложении WHERE.

Для вашего ожидаемого результата вам необходимо уточнить набор результатов, используя условие фильтра или соединения между таблицами, используемыми в запросе.

Используйте приведенный ниже запрос для ожидаемого результата:

SELECT car.id AS carID , maker.name AS makerName , license.plateNumber AS plateNumber FROM car AS car JOIN maker AS maker ON car.id = maker.carId LEFT OUTER JOIN license AS license ON car.id = license.carId WHERE car.id = 4951;e

Я добавил OUTER JOIN в состоянии, чтобы получить желаемый результат, даже если нет номерного знака. При использовании только JOIN условие не принесет желаемого результата, если номер автомобиля для автомобиля не указан.

Смежные вопросы