Access :: LEFT JOIN с константой

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Access :: LEFT JOIN с константой

Сообщение skiperski » 20.09.2005 (Вт) 22:01

Доброе время всем!

Как на ентом %§$&%№%: аксесе реализовать конструкцию вида
Код: Выделить всё
SELECT t1.*, t2.[value]
FROM t1
    LEFT JOIN t2
    ON t2.Id = t1.Id AND t2.[param] = [const]

На MS SQL всё работало без проблем, а Access ругается, гад. В простейших случаях реализовал UNION'ами, но может есть решение проще? В результате должны выводиться все записи из таблицы t1 и значение поля [value], если есть, из t2. Проблема во второй паре усливий, те что после AND. Значение [const] подставляется при формировании запроса. При переносе условия в WHERE Access не ругается, но получаем INNER JOIN, т.ч. это не подходит.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 20.09.2005 (Вт) 22:32

Можно расслабиться, сам нашёл :)

Решается это так
Код: Выделить всё
SELECT t1.*, t2.[value]
FROM t1
    LEFT JOIN t2
    ON t2.Id = t1.Id
WHERE t2.[param] = [const] OR t2.[param] IS NULL

В общем-то логично.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 20.09.2005 (Вт) 22:43

Логично, да, и в сиквеле такое тоже будет работать, но с небольшой оговоркой: он очень не любит ИЛИ в условиях. А поскольку в твоем случае это практ. тот же юнион, только в профиль, то можно в него (в юнион) переписать и погонять в аксессе эти два вида запроса с точки зрения производительности. Не знаю, как тут, а в сиквеле OR проседает по полной - насколько, что выгоднее оказывается создание временной таблицы и джойн на нее. Проверь, рекомендую, а то выяснится еще, что это - фирменная болезнь всех микрософтовских СУБД...

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 21.09.2005 (Ср) 10:23

Ennor, спасибо за совет, надеюсь не понабится. Эта прожка полько под Access'ом будет думать. Это я для примера такой простенький код привёл, а на самом деле запросы могут быть навороченными, т.ч. переписывать их под UNION'ы замукаешься.

Кстати, как в Access'е оценить производительность запроса? Например, с OR и UNION?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 21.09.2005 (Ср) 11:03

Эээ. Насколько я понимаю, аналога SET SHOWPLAN TEXT в аксессе нет... Получается, что только с секундомером. В смысле, QueryPerformanceCounter().

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 21.09.2005 (Ср) 11:31

Запросы, конечно, не простые, но время выполнения сравнительно мало. Плюс погрешность вносимая самой системой. Если бы разница была в разы, тада-та - да. :) А плюс-минус пара миллисекунд рояля не играют.

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 21.09.2005 (Ср) 15:42

Запрос
Код: Выделить всё
SELECT t1.*, t2.[value]
FROM t1
    LEFT JOIN t2
    ON (t2.Id = t1.Id AND t2.[param] = [const])

в акесе пучком выполняется

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 21.09.2005 (Ср) 18:52

Gloom писал(а):в акесе пучком выполняется

:shock: :shock: :shock:

И как после этого называть этот &$%&$%&$ Access? :evil:
Огромное спасибо Gloom'у за выявление такой фичи.

ЗЫ: У меня малюсенький юбилей - это 1111-ое сообщение.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 21.09.2005 (Ср) 21:33

Т.е. - все дело в скобках? Теперь я понимаю, почему те, кто перешел с аксесса, лепят их где надо и где не надо...


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList