powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
27 сообщений из 27, показаны все 2 страниц
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610246
lx09x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
в базе данных две одинаковые таблицы tb_films и tb_films2

пишу запрос в SQLite Exprte - все отлично работает.
переношу его же в delphi:

Query.SelectSQL := 'SELECT * FROM tb_films UNION SELECT * FROM tb_films2';
Query.Open;

ошибка: SQLite3 Error 1 - near "SELECT": syntax error.
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610256
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lx09x> Query.SelectSQL

А Query - это что, библиотека доступа какая ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610257
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lx09x,

Не знаю, в чем ошибка, но юнион без списка полей - это прикольно.

А будет ошибка, если убрать юнион и оставить только 1-й селект?
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610263
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lx09x,

А коннект активен?
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610289
lx09x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пишу в Delphi 7, работаю с БД с помощью DISQLite.

если оставить только 1 селект - все работает отлично!

собственно это объединение мне понадобилось, чтобы придумать как заранее узнать кол-во записей, которое вернулось в результирующем наборе?
(почему то разработчики SQLite не предусмотрели какое-нить свойство к объекту (что-нибудь вроде Query.RecordCount), и теперь вот приходится выполнять дублирующий повторный sql-запрос или считать кол-во итераций в цикле (while not Query.EOF do ...).
Кстати, в моем случае вариант с циклом не подходит, т.к. результат поиска может содержать тысячи строк, а выводить в интерфейс нужно дозировано (постранично = 12 записей на листе).
В общем, нет смысла листать всю выборку, только чтобы посчитать кол-во строк...


в итоге вот, что я придумал:

Код: sql
1.
2.
3.
SELECT * FROM tb_films WHERE tags LIKE '%яблоки%'
union
SELECT null, count(*) as Cnt, null, null, null, null, null, null, null, null, null, null, null  FROM tb_films WHERE tags LIKE '%яблоки%'



..благодаря тому, что в поле "id" содержит только положительные значения (и это не автоинкремент), а я задал для второго запроса id=-1, то после сортировки как
раз получится, что строка с кол-вом записей (результат выборки) - будет первой по счету!
Останется просто считать из нее поле "cnt" (равное кол-ву строк), но не показывать юзеру, а в таблицу вывести только строки начиная со второй!..
получается, по сути, те же 2 одинаковых запроса, зато ОДНИМ заходом!
т.е. в коде не придется после select-а закрывать таблицу, чтобы повторно выполнит тот же запрос, но с уже с count(*), снова считывать результат и т.п.


проверил в SQLite Expert - все отлично работает! (первой строкой идет кол-во строк которое вернул Select)
но я никак не мог подумать, что перенеся этот код в delphi - он откажется работать...

собственно, тогда я и начал упрощать запрос, чтобы понять, что же ему не нравится и
доупрощал до минимума (UNION к двум таблицам с одинаковой структурой и типом полей), в итоге - все равно ошибка.


уже не знаю, что и думать((
может у вас, профессионалов, появятся какие-нибудь мысли на этот счет...



p.s. попробовал и с указанием конкретных полей:

Код: pascal
1.
2.
3.
4.
5.
6.
  Query := TDISQLite3UniDirQuery.Create(nil);
    try
      Query.Database := vkBase;
      Query.SelectSQL := 'SELECT rez1, rez2 FROM tb_films UNION SELECT rez1, rez2 FROM tb_films2'; //tm;
      Query.Open;
   ...


все та же ошибка: SQLite3 Error 1 - near "SELECT": syntax error.
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610303
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lx09xработаю с БД с помощью DISQLite.Возможно, эта библиотека неудачно пытается получить список полей для такого ужасного запроса со * и union.
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610323
Dunkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock,
Библиотека нормальная и запрос даже рабочий.

Но DISQLite3 - коммерческая библиотека.
DISQLite3 Personal, например, много чего не переваривает - нужен DISQLite3 Professional. И версия поновее.
А получить кол-во записей для таблицы SQLite:
Код: pascal
1.
SQL := 'select count(*) from "' + TableName + '"';
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610354
lx09x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DunkinYuRock,
Библиотека нормальная и запрос даже рабочий.

Но DISQLite3 - коммерческая библиотека.
DISQLite3 Personal, например, много чего не переваривает - нужен DISQLite3 Professional. И версия поновее.
А получить кол-во записей для таблицы SQLite:
Код: pascal
1.
SQL := 'select count(*) from "' + TableName + '"';




да, такой запрос работает, это понятно!)

выше я уже писал о том, что начал "городить этот огород" только потому, что не обнаружил более правильного (а в идеале - встроенного в компонент) способа заранее узнать кол-во записей в выборке...

просто показалось странным и нелогичным после основного запроса, отдельно выполнять еще один точно такой же select, но у же с count(*)
и попытался найти другое (пусть и далеко не изящное) решение... (насколько смог это сделать спустя неполные сутки изучения SQLlite)


был бы рад просто услышать нечто вроде:
"чувак, расслабься, в sqllite это невозможно! только отдельным повторным запросом или счетчиком в цикле по всей выборке..." и все, вопрос снят!
еще вариант ответа:
"если бы твоя компонента была версии "Pro", то возможно и запрос с union тоже бы сработал"


(но ведь и Uniun запрос работает! (просто жаль, что моя компонента его не поддерживает)
насколько он ужасен - не так принципиально!
в конце-концов, программа должна решать поставленную задачу, а насколько изящен код, который ее решает - дело второстепенное, а уж конечному юзеру - вообще наплевать на это!)

ну нет у меня столько свободного времени, чтобы думать над разного рода красивостями кода и изящностью подхода!
Запрос составлен правильно - правильно! соответствует всем требованиям UNION и отлично отрабатывает = выдавая нужный результат! значит такой метод рабочий и тоже имеет место быть!
У вас есть другой - более правильный/красивый - предложите. Объясните, чем ваш подход лучше, правильнее, быстрее... и почему)
имхо, так было бы правильнее)
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610356
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lx09x,

зачем тебе вообще общее количество знать?
В конкретно данном случае.
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610362
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lx09x(но ведь и Uniun запрос работает! (просто жаль, что моя компонента его не поддерживает)
насколько он ужасен - не так принципиально!Но это факт. Как и факт то, что эта прекрасная компонента его не поддерживает. Вопрос исчерпан, мне кажется. Уже посоветовали, как правильно посчитать записи простым нормальным запросом.
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610363
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lx09xУ вас есть другой - более правильный/красивый - предложите. Объясните, чем ваш подход лучше, правильнее, быстрее... и почему)Потому, что такие вещи проще делать серверу (хоть это и не сервер). Лучше и быстрее, чем тянуть на клиента и там считать. Очень много ненужных для этого операций выполняться будет.
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610368
lx09x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччДlx09x,

зачем тебе вообще общее количество знать?
В конкретно данном случае.


все просто: для отображения в интерфейсе!
результат поиска выводится в таблицу только по 12 строчек, плюс - имеются кнопочки для перехода к следующим/предыдущим 12 записям (эмуляция постраничного листания)

юзер вводит поисковый запрос и БД возвращает, допустим, 9437 строк --- нужно же как-то сообщить ему об этом!
что-то вроде: "обнаружено: 9437 совпадений (отображена 1 из 786 страниц результатов поиска)"

вот для того, чтобы мне самому сперва посчитать- сколько же это будет в страницах, я должен знать сразу общее кол-во найденных строк!
не могу же я просто отобразить ему табличку и предложить листать ее до конца (как долго - неизвестно)), пока не закончатся все строки, которые обнаружил Select... подобные вещи из разряда - "должны быть", имхо)


жаль, что компонента не поддерживает Union (мне даже понравилось мое извращенное решение)))
буду просто делать повторный запрос: select count(*) from...


всем спасибо за объяснения и готовность помочь!
вопрос исчерпан!
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610372
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lx09xчччДlx09x,
зачем тебе вообще общее количество знать?
В конкретно данном случае.
все просто: для отображения в интерфейсе!
результат поиска выводится в таблицу только по 12 строчек, плюс - имеются кнопочки для перехода к следующим/предыдущим 12 записям (эмуляция постраничного листания)
...
Ну вот смотри, грузишь ты очередные 12 строчек плюс еще одну. Если "еще одна" не грузится - то и следующих страниц нет, кнопку "дальше" показывать не надо.
Иначе можно и кнопку показать.

lx09x...
юзер вводит поисковый запрос и БД возвращает, допустим, 9437 строк --- нужно же как-то сообщить ему об этом!
что-то вроде: "обнаружено: 9437 совпадений (отображена 1 из 786 страниц результатов поиска)"
...
Вот откажись от этой мысли, и жизнь станет проще. Ты ж не тупой яндекс какой-то.
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610386
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lx09xподобные вещи из разрядафинтифлюшек "могу значит надо"
lx09xпусть и далеко не изящное https://code.google.com/archive/p/txquery/
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610428
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте UNION ALL
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610563
Sergiy-Marty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The SQL UNION Operator

The UNION operator is used to combine the result-set of two or more SELECT statements.

Each SELECT statement within UNION must have the same number of columns
The columns must also have similar data types
The columns in each SELECT statement must also be in the same order

UNION Syntax
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
UNION ALL Syntax

The UNION operator selects only distinct values by default. To allow duplicate values, use UNION ALL:
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610595
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lx09x,

Если лишнее поле не мешает, то можно попробовать вот так:
http://www.mysqltutorial.org/mysql-row_number/

дальше - last , считать значение поля, затем first .
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610604
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Belotsky Sergelx09x,

Если лишнее поле не мешает, то можно попробовать вот так:
http://www.mysqltutorial.org/mysql-row_number/

дальше - last , считать значение поля, затем first .

PS: виноватъ, это другая СУБД.
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610700
Dunkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lx09x,

UNION работает в Professional версии. Получить кол-во записей в запросе - это выполнить ещё один запрос. Всё равно быстрее чем тянуть данные и пробегать по записям. Код проверен и работает и есть на stackoverflow.
Код: pascal
1.
2.
3.
Query.SelectSQL := 'select count(*), * from (SELECT * FROM tb_films UNION SELECT * FROM tb_films2)';
Query.Open;
ShowMessage(Query.FieldByName('count(*)').AsString);
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610868
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lx09xне обнаружил более правильного (а в идеале - встроенного в компонент) способа заранее узнать кол-во записей в выборке

в SQL это вообще не гарантируется. По ряду причин.

Самая простая - пока вы читаете ваши данные, кто-то (другая программа или другая часть вашей же программы) может вставить ещё больше данных. Или наоборот, удалить.

И что тогда делать? вам пообещали 1000 строк, и их реально, столько и было.
Но когда вы вычитали 990 строк, ситуация изменилась, и их стало 1005, или ещё хуже 995. И что делать?

PS. на Торри должно быть до фига и больше библиотек для SQLite, начиная с неортодоксального mORMot
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610888
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochИ что делать?Читать доку к своему SQL серверу на предмет уровня изоляции транзакций? К тому же какие конкуренты во встраиваемой либе?

И вообще те, кто пишет звездочки в запросе должны страдать, что мы и наблюдаем.
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39610897
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskyИ вообще те, кто пишет звездочки в запросе должны страдать, что мы и наблюдаем.Особенно те, кто говорит при этом "оно же и так работает"!
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39611254
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskyК тому же какие конкуренты во встраиваемой либе?

TQuery (точнее TDataSet) работают безотносительно деталей реализации и частностей вроде транзакций

вот если он начнет напрямую SQLite API использовать - тогда возражение было бы резонным, если бы не


Ariochили другая часть вашей же программы) может вставить ещё больше данных
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39611309
Василий №2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В контексте задачи - решение такое: просто вычитать весь датасет (FetchAll) и там уже бегать по нему сколько влезет. Если, конечно, он кеширующий, а не лезет за данными каждой записи в либу. Это если памяти хватит. Вариант второй - несколькими запросами: первый - Count, последующие - select ... rows N to N+RowsOnPage. Но тогда есть вероятность изменения набора данных в процессе прохода по нему, не знаю уж, как в sqlite с транзакциями и есть ли у ТС параллельные запросы к базе.

Насчет "советов" про бесполезность RecordCount - вот такие лентяи и придумали "бесконечные ленты", зависающий на середине скроллбар в гриде и прочую бесовщину. Чтоб у вас все встречающиеся скроллбары имели только три положения - начало, середина и конец! ))
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39611313
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самая тупая тема последних 7 дней. Ну, если не считать темы про "вызов из другой формы или из меню".
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39611668
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий №2,

авторпервый - Count, последующие - select ... rows

Главное, что бы Count не сильно долго считался. А то бывают случаи. Пока сервер все записи переберёт...
...
Рейтинг: 0 / 0
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
    #39611859
Василий №2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonГлавное, что бы Count не сильно долго считался. А то бывают случаи. Пока сервер все записи переберёт...
Это уже за рамками сабжа... в крайнем случае выполнять получение Count можно и в фоне, если уж он сильно тормозит процесс.
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]