Как создать запрос, чтобы получить все записи из одной таблицы и заполнить информацию о полях из второй таблицы с помощью оператора where?

#sql #ms-access-2007

#sql #ms-access-2007

Вопрос:

У меня есть две таблицы. Один называется prem и содержит все идентификаторы, которые существуют в системе, и JimsQueryByColl, который содержит большинство этих идентификаторов с прикрепленной различной информацией. Я пытаюсь создать единый запрос, который будет включать все идентификаторы из prem и все записи из JimsQueryByColl where JimsQueryByColl.Коллекционер = «Фредерик Роуд». Текущий запрос, который у меня есть, выглядит следующим образом, но предоставляет только последнюю часть информации (без идентификаторов из prem, которые не отображаются в списке идентификаторов с Frederick Road в колонке collector):

ВЫБЕРИТЕ Prem.meter_miu_id, JimsQueryByColl.*, Prem.longitude, Prem.latitude
В начале СЛЕВА ПРИСОЕДИНИТЕСЬ К JimsQueryByColl НА Prem.meter_miu_id = JimsQueryByColl.[Идентификатор MIU]
ГДЕ (((JimsQueryByColl.Коллектор)=»Frederick Road»))

Обычно левое соединение достигло бы того, чего я хочу, но инструкция where делает это так, что идентификаторы, которые содержали бы пустую информацию для всех, кроме поля *Prem.meter_miu_id*, не включены. Я попытался добавить «или JimsQueryByColl.Значение Collector РАВНО НУЛЮ» для инструкции WHERE, но это не дало правильного результата.

Два текущих метода запроса, которые у меня есть для получения нужной информации, называются FredrickRoad и Query3:

FredrickRoad-

ВЫБЕРИТЕ JimsQueryByColl.* ИЗ JimsQueryByColl, ГДЕ (((JimsQueryByColl.Коллектор)=»Frederick Road»))

За которым следует Query3 —

ВЫБЕРИТЕ Prem.meter_miu_id, JimsQueryByColl.*, Prem.longitude, Prem.latitude СЛЕВА ОТ Prem.JOIN JimsQueryByColl НА Prem.meter_miu_id = JimsQueryByColl.[Идентификатор MIU] ГДЕ (((JimsQueryByColl.Коллектор)=»Frederick Road»));

Но я хотел бы сделать это за один шаг, если это возможно. Я надеюсь, что я написал это ясно, и если кому-то нужно разъяснение, просто спросите.

Текущее решение

ВЫБЕРИТЕ Prem.meter_miu_id, JimsQueryByColl.*, Prem.longitude, Prem.latitude
в FrederickRoad СЛЕВА ОТ НАЧАЛА, ЧТОБЫ ПРИСОЕДИНИТЬСЯ к JimsQueryByColl НА (Prem.meter_miu_id = JimsQueryByColl.[MIU ID]
И JimsQueryByColl.Коллектор=»Frederick
Road»)

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

Ответ №1:

Попробуйте:

 SELECT Prem.meter_miu_id, JimsQueryByColl.*, Prem.longitude, Prem.latitude
FROM Prem LEFT JOIN JimsQueryByColl 
ON (Prem.meter_miu_id = JimsQueryByColl.[MIU ID] 
AND JimsQueryByColl.Collector="Frederick Road")
  

Комментарии:

1. У меня это не работает, похоже, что AND в инструкции join не поддерживается Access 2007

2. Заставил это работать. Все, что мне нужно было сделать, это окружить «Prem.meter_miu_id = JimsQueryByColl.meter_miu_id = JimsQueryByColl. [MIU ID] И JimsQueryByColl. Коллектор=»Frederick Road»» в круглых скобках. Спасибо за помощь.

3. На самом деле, это работает и отчасти нет. Я могу заставить Access сделать это один раз, но когда я пытаюсь закрыть его и запустить снова, он по-прежнему выдает мне ошибку «Выражение объединения не поддерживается» и вообще не открывает запрос. Есть идеи, как заставить это работать в Access?

4. Заключив в круглые скобки оператор On, как вы показали, но когда я закрываю Access и открываю его обратно и пытаюсь открыть запрос, даже в режиме конструктора, он выдает мне эту ошибку. И даже когда я могу запустить его при первом вводе sql, он выдает мне эту ошибку, если я пытаюсь отсортировать результат по Prem.meter_miu_id. У меня нет ответа на то, как он выдает мне правильный результат, а затем сообщает мне, что оператор join не поддерживается. Для меня это не имеет смысла.

5. Можете ли вы указать точную инструкцию, которую вы пытаетесь — вы только что упомянули, что добавили инструкцию ‘order by’. Нет причин, по которым «точно» такой же запрос сработал бы в одну секунду и не сработал бы в следующую секунду.