Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL запрос [D5, Access]


Страницы:   1 2 3

juster ©   (2002-08-24 11:31:00) 

Доброго всем дня.
Такай trouble: делаю из программы запрос:
select Field1, Field2, Field3 from table1, table2 where ...
в базе Access из нескольких таблиц.
Все работает. Добавляю GROUP BY Field2 - возникает ошибка:
you tried to execute a query that does not include the specified expression Field1(первое поле указанное в запросе) as part of ann aggregate function
По русски говоря Access хочет чтобы было
GROUP BY Field1, Field2, Field3, но это же мне не надо это же просто результат без дублируемых записей, которых у меня заведомо нет. Кстати, такой же запрос на такой же базе данных работает безукоризненно в MYSQL. Что делать, может перейти на другой движок вместо Access, посоветуйте на какой, что без troube


juster   (2002-08-28 11:37:00) [21]

to ЮЮ
Да использую BDE, но с Access даже простейший запрос
select * from tblname не редактируется.
Access 2000:
Создаю запрос где-то на форме
qry:=TQuery.Create(self);
Присваиваю alias из BDE
qry.DatabaseName:=Alias;
Добавляю SQL
qry.SQL.Add(select * from tblname);
qry.Open;
Устанавливаю свойство RequestLive
qry.RequestLive:=true;
Пытаюсь изменить значение в поле Field1
qry["Field1"]:=SomeVariant;
не выходит
Ты говоришь можно редактировать, а как? Может я что-то не так делаю?


ЮЮ   (2002-08-28 04:51:00) [22]

сложный запрос никакой движок не позволит редактировать.

Access позволяет редактировать даже запросы, полученные связыванием left join, если в правой таблице есть записи.

Кстати, ты используешь ADO или BDE?


juster   (2002-08-27 13:18:00) [23]

к ЮЮ
Ты прав ситуация возможно решаема, используя несколько запросов.
Но самое большое неудобство в Access, это то что запросы типа select являются нередактируемыми, это вот заноза.
Приходится использовать либо временные таблицы, либо массивы или еще как-то сохранять информацию про изменения, при этом необходимо использовать компоненты не связанные с базами данных. Потом записывать измененные данные в таблицы, делать Refresh исходному запросу(select). Все это хлопотно и делает сложность в проге. Поэтому-то я и пытаюсь сейчас перейти на другой движок.
К тому же выражение в where вычисляется динамически - еще один камень в огороде.


ЮЮ   (2002-08-27 05:09:00) [24]

Так и не ответил на ЮЮ © (26.08.02 03:46)
Можно побольше информации о таблицах: есть ли уникальные поля и по каким полям связываются таблицы, т.к. в общем случае задача может не иметь решения

>жуткие если в where что-то большое

Возможно стоит использовать подзапросы, сначала отбирая записи по where, а затем делать Group и связывать таблицы через left join


Balu   (2002-08-26 14:20:00) [25]

Создай в Access-е запрос

select Field1, Field2, Field3 from table1, table2 where ...

И потом обращайся к этому запросу

SELECT Field2, MIN(Field1), MIN(Field3) FROM Запрос1 where ...


juster   (2002-08-26 12:20:00) [26]

to Reindeer Moss Eater.
Не совсем так. Они меня не интересуют какими они будут, лижбы это были реальные значения из какой-то строки, группировка по Field2. Вот и решение:
SELECT
First(Field1) as First_Field1,
Field2,
First(Field3) as First_Field3
FROM table1, table2
where ...
order by Field2;
только повторюсь тормоза жуткие если в where что-то большое, ненавижу Access, посоветуйте что-нибудь другое а?


Reindeer Moss Eater   (2002-08-26 12:01:00) [27]

мне надо чтобы вместо 3 строк в данном случае была одна любая из них

То есть, значения полей F1 и F2 тебя вообще не интересуют.
Значит запрос твой должен выглядеть так :
Select distinct Field2 from Table1


juster   (2002-08-26 11:56:00) [28]

Если поробовать:
SELECT
First(Field1) as First_Field1,
Field2,
First(Field3) as First_Field3
FROM table1, table2
where ...
order by Field2;
то вроде как это решение проблемы, но опять таки это не панацея в данном случае - не все движки понимают что такое First.
В Access это заработало, но если в where стоит что-то сложное и длинное, то тормоза ощутимы вплоть до того, что время возврата запроса может быть просто немыслимым.
Вот такой вот компот. База небольшая, на локальной машине, так что либо я где-то что-то упустил, либо можно поставить еще один баг в продукции Microsoft.
Думаю переходить на другой движок, что подскажете?



ЮЮ   (2002-08-26 03:46:00) [29]

to Johnmen © (24.08.02 21:18)
Там нет рещения данной проблемы

to juster
Можно побольше информации о таблицах: есть ли уникальные поля и по каким полям связываются таблицы, т.к. в общем случае задача может не иметь решения


Johnmen   (2002-08-24 21:18:00) [30]

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1030094894&n=1


juster   (2002-08-24 14:43:00) [31]

Нет не так. Нужно чтобы в результате не повторялись значения в Field2 и только в нем допустим(суть важна что убрать повторения только в одлном поле).
Пусть есть запрос SELECT Field1, Field2, Field3 FROM table1, table2 where ...
результат предположим
Field1 Field2 Field3
1 1 2
2 1 3
3 1 3
мне надо чтобы вместо 3 строк в данном случае была одна любая из них(опять таки в данном случае) - в Field2 только одно повторяющееся значение это 1, надо убрать повторение в этом поле, т. е. удовлетворяет одна из 3 строк, любая.
Если добавить DISTINCT ничего не измениться(полностью повторяющихся строк нет)
Может быть использовать first?


Balu   (2002-08-24 14:23:00) [32]

Я не работал с MySQL, но принцип T-SQL по моему нарушать ни в одной среде разработчики не собирались, иначе бред полный получается.
Если стрелять из пистолета по самолётам, то у тебя ничего не получится. Это к тому что в каждой ситуации необходимо пользоваться тем инструментом (язоковыми конструкциями) которые решают эту конкретную проблему.
Если тебе необходимо получить уникальные значение по Field1, Field2, Field3, то Введи:
SELECT DISTINCTField1, Field2, Field3 FROM table1, table2 where ...

и все будет нормально, или полнее опиши свою проблему, если я тебя не так понял.


juster   (2002-08-24 12:51:00) [33]

И зря не веришь выборка из разных таблиц нескольких полей в конце ставишь group by по любому одному из полей - все работает.
Это ладно проблема в Access. Понятно что остальные поля он тоже хочет аггрегировать, но не знает как и хочет чтобы ему сказали.
Ты предлагаешь max() - нет не подходит надо чтобы была реальная строка из базы
или 1 1 1
или 2 1 2
или 3 1 3
и никак не 2 1 3



ЮЮ   (2002-08-24 12:28:00) [34]

>Может быть я не прав, но в MySQL это работает
не верю


ЮЮ   (2002-08-24 12:26:00) [35]

Или, например, max(f1),f2,max(f3)
ecли max(f1 и max(f3) тебе о чём-нибудь скажут, ведь они могут быть получены из разных записей.


ЮЮ   (2002-08-24 12:23:00) [36]

Так тогда и выбирай только f2, если f1 b f3 тебе без разницы :-)


juster   (2002-08-24 12:21:00) [37]

Хорошо если я напишу group by f2 это не правильно? Может быть я не прав, но в MySQL это работает, именно этот конкретный пример я не проверял, но в моей базе без проблем


juster   (2002-08-24 12:17:00) [38]

Мне без разницы или это будет
f1 f2 f3
2 1 2
или
f1 f2 f3
3 1 3
главное чтобы в результате не было строк с одинаковыми значениями в f2


ЮЮ   (2002-08-24 12:15:00) [39]

Каким же образом из
1 1 1
2 1 2
3 1 3
ты хочешь получить
1 1 1 ?
Не думаю, что ты сможешь получить такое с помощью MYSQL :-)


juster   (2002-08-24 12:12:00) [40]

Хотя конечно такой ситуции у меня заведомо не случиться, но если скажем я хочу получить из этого
f1 f2 f3
1 1 1


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо