Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Неприятное ограничение SQL в Access  [new]
gsv1
Member

Откуда: Новокузнецк
Сообщений: 172
Имеются таблицы:

ТРЕНЕР(ИД, ИМЯ)
ЗАНЯТИЕ(ИД, ИМЯ)
ПЛАТЕЖ(ИДТРЕНЕР, ДАТА, ИДЗАНЯТИЕ, СУММА)
ЗАРПЛАТА(ИДТРЕНЕР, ИДЗАНЯТИЕ, ПРОЦЕНТ)

Оказывается в Access нельзя выполнить такой запрос:

SELECT ТРЕНЕР.ИМЯ, ЗАНЯТИЕ.ИМЯ, ЗАРПЛАТА.ПРОЦЕНТ, ПЛАТЕЖ.ДАТА
FROM (
(ПЛАТЕЖ LEFT JOIN ЗАНЯТИЕ ON ПЛАТЕЖ.ИДЗАНЯТИЕ=ЗАНЯТИЕ.ИД)
LEFT JOIN ТРЕНЕР ON ПЛАТЕЖ.ИДТРЕНЕР=ТРЕНЕР.ИД)
LEFT JOIN ЗАРПЛАТА ON ЗАРПЛАТА.ИДТРЕНЕР=ПЛАТЕЖ.ИДТРЕНЕР AND
ЗАРПЛАТА.ИДЗАНЯТИЕ=ПЛАТЕЖ.ИДЗАНЯТИЕ

Выясняется, что недопустимо именно использование условия ЗАРПЛАТА.ИДТРЕНЕР=ПЛАТЕЖ.ИДТРЕНЕР AND ЗАРПЛАТА.ИДЗАНЯТИЕ=ПЛАТЕЖ.ИДЗАНЯТИЕ
при внешнем соединении (конкретно AND)! Это очень ограничительно по сравнению со стандартом…

Может быть знатоки Access подскажут как поступить в случае, когда НЕОБХОДИМО соединить таблицы по двум полям?

Заранее благодарю
8 фев 06, 05:44    [2332008]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
ideas
Member

Откуда:
Сообщений: 16
а почему бы не попробовать добавить еще одно left join между ЗАРПЛАТА.ИДТРЕНЕР=ПЛАТЕЖ.ИДТРЕНЕР AND ЗАРПЛАТА.ИДЗАНЯТИЕ=ПЛАТЕЖ.ИДЗАНЯТИЕ
8 фев 06, 06:33    [2332024]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
gsv1
Member

Откуда: Новокузнецк
Сообщений: 172
ideas
а почему бы не попробовать добавить еще одно left join между ЗАРПЛАТА.ИДТРЕНЕР=ПЛАТЕЖ.ИДТРЕНЕР AND ЗАРПЛАТА.ИДЗАНЯТИЕ=ПЛАТЕЖ.ИДЗАНЯТИЕ


Т. е. предлагается такое?

SELECT ТРЕНЕР.ИМЯ, ЗАНЯТИЕ.ИМЯ, ПЛАТЕЖ.ДАТА,
ЗАРПЛАТА.ПРОЦЕНТ, З.ПРОЦЕНТ
FROM ((
(ПЛАТЕЖ LEFT JOIN ЗАНЯТИЕ ON ПЛАТЕЖ.ИДЗАНЯТИЕ=ЗАНЯТИЕ.ИД)
LEFT JOIN ТРЕНЕР ON ПЛАТЕЖ.ИДТРЕНЕР=ТРЕНЕР.ИД)
LEFT JOIN ЗАРПЛАТА ON ЗАРПЛАТА.ИДТРЕНЕР=ПЛАТЕЖ.ИДТРЕНЕР)
LEFT JOIN ЗАРПЛАТА З ON З.ИДЗАНЯТИЕ=ПЛАТЕЖ.ИДЗАНЯТИЕ

Может быть... Но ясно, что еще одно соединение лишнее и. кроме того, новый запрос не эквивалентен исходному. Впрочем может быть это его можно использовать при условии дополнительного анализа на клиенте... - до конца мне это не ясно пока. Спасибо за мысль

Однако нет ли чего попроще и ближе к исходной цели?
8 фев 06, 07:18    [2332056]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
gsv1
Member

Откуда: Новокузнецк
Сообщений: 172
SELECT ТРЕНЕР.ИМЯ, ЗАНЯТИЕ.ИМЯ, ПЛАТЕЖ.ДАТА,
ЗАРПЛАТА.ПРОЦЕНТ, З.ПРОЦЕНТ
FROM ((
(ПЛАТЕЖ LEFT JOIN ЗАНЯТИЕ ON ПЛАТЕЖ.ИДЗАНЯТИЕ=ЗАНЯТИЕ.ИД)
LEFT JOIN ТРЕНЕР ON ПЛАТЕЖ.ИДТРЕНЕР=ТРЕНЕР.ИД)
LEFT JOIN ЗАРПЛАТА ON ЗАРПЛАТА.ИДТРЕНЕР=ПЛАТЕЖ.ИДТРЕНЕР)
LEFT JOIN ЗАРПЛАТА З ON З.ИДЗАНЯТИЕ=ПЛАТЕЖ.ИДЗАНЯТИЕ

Нет, подумав я понял, что этот вариант не годится абсолютно:
из ЗАРПЛАТА надо извлечь запись по двойному условию а так получается какая то по одному и какаято по другому :(

Есть ли решение в одном запросе? Сомнительно в силу ограничений Access...
8 фев 06, 08:11    [2332119]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
serpentariy
Member

Откуда:
Сообщений: 265
Создал таблицы, такие-же как у вас в первом посте и выполнил такой же запрос.
Всё работает.
8 фев 06, 08:33    [2332142]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
gsv1
Member

Откуда: Новокузнецк
Сообщений: 172
serpentariy
Создал таблицы, такие-же как у вас в первом посте и выполнил такой же запрос.
Всё работает.


Т. е. ограничение, прописанное в помощи на условие соединения JOIN, на вас не действует? Умеет народ обходить законы! А если серьезно, то не верю ): хотя и рад бы... Я ведь сам сначала попробывал это сделать а потом обратился сюда. Какая у вас версия - у меня Access 2003
8 фев 06, 11:05    [2332690]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
какое ограничение
Guest
gsv1
serpentariy
Создал таблицы, такие-же как у вас в первом посте и выполнил такой же запрос.
Всё работает.


Т. е. ограничение, прописанное в помощи на условие соединения JOIN, на вас не действует? Умеет народ обходить законы! А если серьезно, то не верю ): хотя и рад бы... Я ведь сам сначала попробывал это сделать а потом обратился сюда. Какая у вас версия - у меня Access 2003


Не подскажете, о каком именно ограничении идет речь?
8 фев 06, 11:20    [2332794]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
gsv1
Member

Откуда: Новокузнецк
Сообщений: 172
какое ограничение


Не подскажете, о каком именно ограничении идет речь?


Оно описано в первом посте. Еще раз:
при внешнем соединении нельзя использовать условие соединения, отличающееся от такого:

Табл1.Поле1 = Табл2.Поле2

например, так нельзя

LEFT JOIN Табл1.Поле1 = Табл2.Поле2 AND Табл1.Поле3 = Табл2.Поле4

что ограничительно по отношению к SQL92
8 фев 06, 11:29    [2332846]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
типы полей?
Guest
Аксесс 2000. Создал такие таблицы, как указано автором. Скопировал запрос. Выполнил. Все ОК. Можно предположить, что есть несоответствие в типах полей.
8 фев 06, 11:30    [2332859]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
gsv1
Member

Откуда: Новокузнецк
Сообщений: 172
Ну не знаю уж...

Если в 2003 сделать запрос с

LEFT JOIN ЗАРПЛАТА ON ЗАРПЛАТА.ИДТРЕНЕР=ПЛАТЕЖ.ИДТРЕНЕР AND
ЗАРПЛАТА.ИДЗАНЯТИЕ=ПЛАТЕЖ.ИДЗАНЯТИЕ

то выдает сообщение:

недопустимый синтаксис объединения а по линку в справке читаем, что можно только

LEFT JOIN ЗАРПЛАТА ON ЗАРПЛАТА.ИДТРЕНЕР=ПЛАТЕЖ.ИДТРЕНЕР

или только

LEFT JOIN ЗАРПЛАТА ON ЗАРПЛАТА.ИДЗАНЯТИЕ=ПЛАТЕЖ.ИДЗАНЯТИЕ

но не и то и другое вместе!
8 фев 06, 11:36    [2332899]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
это где в справке?
Guest
gsv1
Ну не знаю уж...

Если в 2003 сделать запрос с

LEFT JOIN ЗАРПЛАТА ON ЗАРПЛАТА.ИДТРЕНЕР=ПЛАТЕЖ.ИДТРЕНЕР AND
ЗАРПЛАТА.ИДЗАНЯТИЕ=ПЛАТЕЖ.ИДЗАНЯТИЕ

то выдает сообщение:

недопустимый синтаксис объединения а по линку в справке читаем, что можно только

LEFT JOIN ЗАРПЛАТА ON ЗАРПЛАТА.ИДТРЕНЕР=ПЛАТЕЖ.ИДТРЕНЕР

или только

LEFT JOIN ЗАРПЛАТА ON ЗАРПЛАТА.ИДЗАНЯТИЕ=ПЛАТЕЖ.ИДЗАНЯТИЕ

но не и то и другое вместе!


Если не сложно, процитируйте справку.
8 фев 06, 11:39    [2332914]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
4321
Member [заблокирован]

Откуда:
Сообщений: 3573
gsv1

при внешнем соединении нельзя использовать условие соединения, отличающееся от такого:

Табл1.Поле1 = Табл2.Поле2

например, так нельзя

LEFT JOIN Табл1.Поле1 = Табл2.Поле2 AND Табл1.Поле3 = Табл2.Поле4

что ограничительно по отношению к SQL92
.1это не правда. создайте в контрукторе запросов запрос слевым джойном по 2 полям, и посмотрите его результат в SQL - скорее всего попросту надо расставить скобки в ON.

2. если не врет мой склероз, аксесс начиная с 2002 поддерживает 2 разновидности синтаскиса SQL, что регулируется неким крыжиком
8 фев 06, 11:39    [2332916]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
Темный
Member

Откуда:
Сообщений: 11941
Крыжик тут не причем.
Без скобок также все работает.
8 фев 06, 11:42    [2332939]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
LeonM
Member

Откуда: Bayern, Deutschland
Сообщений: 598
внешний JOIN сдеайте INNER
8 фев 06, 11:48    [2332985]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
4321
Member [заблокирован]

Откуда:
Сообщений: 3573
типы полей?
Аксесс 2000. Создал такие таблицы, как указано автором. Скопировал запрос. Выполнил. Все ОК. Можно предположить, что есть несоответствие в типах полей.
в JetSQL (в 97, по крайней мере) такое объединение ((1->2)=>3 (ON 1-3 AND 2-3) (т.е. при смеси условий по таблицам в join) наскакивает на сообщение о "неоднозначных внешних связях", решается через промежуточный именованный запрос (1->2), либо сохраненный, либо в конструкции [SELECT ... ]. AS Q. Как ругается конструкция у афтара - не знаю. Возможно он действительно линукует разные типы.
8 фев 06, 12:19    [2333169]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
просто скопировал
Guest
4321
типы полей?
Аксесс 2000. Создал такие таблицы, как указано автором. Скопировал запрос. Выполнил. Все ОК. Можно предположить, что есть несоответствие в типах полей.
в JetSQL (в 97, по крайней мере) такое объединение ((1->2)=>3 (ON 1-3 AND 2-3) (т.е. при смеси условий по таблицам в join) наскакивает на сообщение о "неоднозначных внешних связях", решается через промежуточный именованный запрос (1->2), либо сохраненный, либо в конструкции [SELECT ... ]. AS Q. Как ругается конструкция у афтара - не знаю. Возможно он действительно линукует разные типы.

Я скопировал запрос из поста автора и не меняя текст, запустил на выполнение. Он был выполнен безо всякой ругани со стороны Аксесса. Поскольку я таблицы не заполнял (просто создал с именами указанными автором) результат select-a - 0 записей.
8 фев 06, 12:34    [2333258]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
просто скопировал
Guest
Вот как выглядит этот запрос в конструкторе.
Какие тут "неоднозначные внешние связи"?

К сообщению приложен файл. Размер - 0Kb
8 фев 06, 13:01    [2333417]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
gsv1
Member

Откуда: Новокузнецк
Сообщений: 172
просто скопировал
Вот как выглядит этот запрос в конструкторе.
Какие тут "неоднозначные внешние связи"?


Пожалйста покажите текст SQL
У меня сообщает: Не поддерживает выражение объединения

TO LeonM
INNER вместо OUTER мне не нужен, хотя результат будет тот же если не через WHERE

TO это где в справке?
Справка Microsoft Office Access
Операции LEFT JOIN, RIGHT JOIN
Объединяют записи исходных таблиц при использовании в любом предложении FROM.
Синтаксис
FROM таблица_1 [ LEFT | RIGHT ] JOIN таблица_2
ON таблица_1.поле_1 оператор таблица_2.поле_2
Ниже перечислены аргументы операций LEFT JOIN и RIGHT JOIN:
Элемент Описание
таблица_1, таблица_2 Имена таблиц, записи которых подлежат объединению.
поле_1, поле_2 Имена объединяемых полей. Поля должны иметь одинаковый тип данных и содержать данные одного рода, однако могут иметь разные имена.
оператор Любой оператор сравнения: "=", "<", ">", "<=", ">=" или "<>".
...
8 фев 06, 14:09    [2333911]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
4321
Member [заблокирован]

Откуда:
Сообщений: 3573
просто скопировал
Я скопировал запрос из поста автора и не меняя текст, запустил на выполнение. Он был выполнен безо всякой ругани со стороны Аксесса. Поскольку я таблицы не заполнял (просто создал с именами указанными автором) результат select-a - 0 записей.
мои извенения - просматривал текст и показалось, что последнй джон идет к разным таблам предыдущщих. Был невнимателен, "вспылил". (ващето я щас попросту "никакой", прошу не брать во внимание)
8 фев 06, 14:19    [2333995]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
4321
Member [заблокирован]

Откуда:
Сообщений: 3573
4321
мои извенения
иззвенения
8 фев 06, 14:21    [2334005]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
gsv1
Member

Откуда: Новокузнецк
Сообщений: 172
Я тоже прошу прощения - неправильно сформировал модель, для которой задал исходный вопрос. Некоторые посты убедили меня что Access таки умеет соединять таблицы по 2 полям но не получается другое (если переформулировать запрос с большим приближением к моей ситуации):

SELECT ТРЕНЕР.ИМЯ, ЗАНЯТИЕ.ИМЯ, ЗАРПЛАТА.ПРОЦЕНТ, ПЛАТЕЖ.ДАТА
FROM (
(ПЛАТЕЖ LEFT JOIN ЗАНЯТИЕ ON ПЛАТЕЖ.ИДЗАНЯТИЕ=ЗАНЯТИЕ.ИД)
LEFT JOIN ТРЕНЕР ON ПЛАТЕЖ.ИДТРЕНЕР=ТРЕНЕР.ИД)

LEFT JOIN ЗАРПЛАТА ON ЗАРПЛАТА.ИДТРЕНЕР=ПЛАТЕЖ.ИДТРЕНЕР AND
ЗАРПЛАТА.ИДЗАНЯТИЕ=ЗАНЯТИЕ.ИДЗАНЯТИЕ

Т. е. по видимому нельзя использовать в разделе ON условия включающие более 2 таблиц?
8 фев 06, 15:14    [2334314]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
serpentariy
Member

Откуда:
Сообщений: 265
На это 4321 дал ответ в 12:19
8 фев 06, 15:36    [2334450]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
Иванов Егор
Guest
Я тоже сталкивался с подобной проблемой, так и не решил ее.
Воспользовался обходным путем, который, называется неявное связывание (вроде так), только дело в том, что при этом происходил не левое соединение, а полное. Но зато работает без проблем с любым количеством связываемых таблиц.
8 фев 06, 18:05    [2335336]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
gsv1
Member

Откуда: Новокузнецк
Сообщений: 172
serpentariy
На это 4321 дал ответ в 12:19

В принципе да, но ограничение стандарта остается :(. Кстати, что значит
4321
решается через промежуточный именованный запрос (1->2), либо сохраненный, либо в конструкции [SELECT ... ]. AS Q

В частности [SELECT ... ]. AS Q? Может я чего то не знаю из возможностей Access - или имелось в виду просто CREATE VIEW?

Что касается
Иванов Егор
Я тоже сталкивался с подобной проблемой, так и не решил ее. Воспользовался обходным путем, который, называется неявное связывание (вроде так), только дело в том, что при этом происходил не левое соединение, а полное. Но зато работает без проблем с любым количеством связываемых таблиц.

то это (полное соединение) не подходит, необходимо левое но вот что такое неявное связывание?!

Спасибо всем откликнувшимся
8 фев 06, 18:25    [2335450]     Ответить | Цитировать Сообщить модератору
 Re: Неприятное ограничение SQL в Access  [new]
Иванов Егор
Guest
автор
то это (полное соединение) не подходит, необходимо левое но вот что такое неявное связывание?!

Формулировка взята из MySQL, хотя может я чего попутал.
Чтобы долго не объяснять, вот пример (простой):
SELECT
  ТРЕНЕР.ИМЯ, ЗАНЯТИЕ.ИМЯ
FROM
  ПЛАТЕЖ, ТРЕНЕР
WHERE
  ПЛАТЕЖ.ИДЗАНЯТИЕ=ЗАНЯТИЕ.ИД AND
  ПЛАТЕЖ.ИДТРЕНЕР=ТРЕНЕР.ИД
8 фев 06, 18:35    [2335499]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft Access Ответить