![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Думал над запросом. Чего-то ничего в голову не приходит.
Преамбула:
Есть БД. Для БД есть клиент. С этим клиентом долгое время работали,
поэтому в БД не столь мало записей.
Сейчас пишу новый клиент.
Структура БД будет меняться, но не хотелось бы усложнять себе, кхм, проблемы.
Собственно задача:
В БД есть таблица car. В ней поле CARMARK.
Старый клиент заносил в это поле название машины.
Также в БД есть таблица carmark, которая не используется в старом клиенте.
Новый клиент заносит в поле car.CARMARK ID машины в таблице carmark.
При этом, если в таблице carmark не найдено ID_CARMARK, соотв. car.CARMARK,
клиент должен выводить значение car.CARMARK.
Вопрос состоит в том как их связать.
Например, мне требуется выбрать все машины из таблицы car.
select * from car left join carmark on car.CARMARK = carmark.ID_CARMARK, car_type, purpose_type where (car.ID_CAR_TYPE = car_type.ID_CAR_TYPE and car.ID_PURPOSE_TYPE = purpose_type.ID_PURPOSE_TYPE)
(Запрос не проверял).
Проблема в том, что JOIN подставит NULL, а не значение из таблицы car,
если таковое отсутствует в carmark.
Как решить эту проблему?
Неактивен
Ну, например, методом «автоматического пристального вглядывания» —
сначала получить список всех типов автомобилей:
SELECT DISTINCT carmark FROM car
и записать этот список в отдельную табличку, выдавая номера. После
этого у любого текстового типа автомобиля из этого списка будет
непустой JOIN
Неактивен
Проблема-то в том, что хочется использовать марки из таблицы carmark...
Т.е., если в carmark такого ID нет, то было подставлено в результат значение этого
ID из car.
А, если ID в car соответствует ID в carmark, было подставлено значение из carmark.
А значения, которые там понаписали в car, вообще, не использовать.
При изменении марки, заменять их на ID.
P.S.:
Кстати, марка ТС выбиралась из списка. Т.е., в принципе, названия в car
могут соответствовать названиям (не ID!) в carmark.
Ведь возможно, в таком случае, написать скрипт, который их перегонит в ID?
Неактивен
Все, я понял, Вы не хотите переделывать базу на новый клиент, Вы
хотите, чтобы новый клиент работал в т.ч. и со старыми данными
на чтение.
Такое решение неудачное, т.к. не сможет использовать индексы.
Лучше сразу перегнать всё в id. Можете вытаскивать, например,
и значение колонки в car и значение в присоединенной (LEFT JOIN)
табличке. Тогда если присоединенное значение NULL, то нужно
выводить значение из основной таблицы.
Но лучше, все же, перевести все на id.
Неактивен
Все, я понял, Вы не хотите переделывать базу на новый клиент, Вы
хотите, чтобы новый клиент работал в т.ч. и со старыми данными
на чтение.
Да. Но с некоторым уточнением.
Я хочу переделать. Но постепенно.
Новый клиент уже будет заносить идентификаторы.
Но читать должен и то, и это.
Такое решение неудачное, т.к. не сможет использовать индексы.
Не очень понимаю. Только индекс по carmark? Или, вообще, индексы в таблице?
Лучше сразу перегнать всё в id.
Дело в том, что со старым клиентом сейчас работают.
Нужно сделать и показать, что работает.
Хотя бы на чтение, для начала...
Затем, менять структуру БД.
Когда будет дописан новый клиент (если будет :-\ ) и будет переход на него.
Можете вытаскивать, например,
и значение колонки в car и значение в присоединенной (LEFT JOIN)
табличке. Тогда если присоединенное значение NULL, то нужно
выводить значение из основной таблицы.
Т.е., тот же запрос, только проверять на NULL в клиенте?
Отредактированно Артём Н. (07.03.2010 19:55:48)
Неактивен
Ну, да, это самый простой способ.
Неактивен
Ясно. Наверное, так и сделаю.
Спасибо.
Неактивен