|
|
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. в базе данных две одинаковые таблицы 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2018, 18:02 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
lx09x> Query.SelectSQL А Query - это что, библиотека доступа какая ? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2018, 18:56 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
lx09x, Не знаю, в чем ошибка, но юнион без списка полей - это прикольно. А будет ошибка, если убрать юнион и оставить только 1-й селект? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2018, 18:58 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
lx09x, А коннект активен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2018, 19:21 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
пишу в Delphi 7, работаю с БД с помощью DISQLite. если оставить только 1 селект - все работает отлично! собственно это объединение мне понадобилось, чтобы придумать как заранее узнать кол-во записей, которое вернулось в результирующем наборе? (почему то разработчики SQLite не предусмотрели какое-нить свойство к объекту (что-нибудь вроде Query.RecordCount), и теперь вот приходится выполнять дублирующий повторный sql-запрос или считать кол-во итераций в цикле (while not Query.EOF do ...). Кстати, в моем случае вариант с циклом не подходит, т.к. результат поиска может содержать тысячи строк, а выводить в интерфейс нужно дозировано (постранично = 12 записей на листе). В общем, нет смысла листать всю выборку, только чтобы посчитать кол-во строк... в итоге вот, что я придумал: Код: sql 1. 2. 3. ..благодаря тому, что в поле "id" содержит только положительные значения (и это не автоинкремент), а я задал для второго запроса id=-1, то после сортировки как раз получится, что строка с кол-вом записей (результат выборки) - будет первой по счету! Останется просто считать из нее поле "cnt" (равное кол-ву строк), но не показывать юзеру, а в таблицу вывести только строки начиная со второй!.. получается, по сути, те же 2 одинаковых запроса, зато ОДНИМ заходом! т.е. в коде не придется после select-а закрывать таблицу, чтобы повторно выполнит тот же запрос, но с уже с count(*), снова считывать результат и т.п. проверил в SQLite Expert - все отлично работает! (первой строкой идет кол-во строк которое вернул Select) но я никак не мог подумать, что перенеся этот код в delphi - он откажется работать... собственно, тогда я и начал упрощать запрос, чтобы понять, что же ему не нравится и доупрощал до минимума (UNION к двум таблицам с одинаковой структурой и типом полей), в итоге - все равно ошибка. уже не знаю, что и думать(( может у вас, профессионалов, появятся какие-нибудь мысли на этот счет... p.s. попробовал и с указанием конкретных полей: Код: pascal 1. 2. 3. 4. 5. 6. все та же ошибка: SQLite3 Error 1 - near "SELECT": syntax error. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2018, 20:51 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
lx09xработаю с БД с помощью DISQLite.Возможно, эта библиотека неудачно пытается получить список полей для такого ужасного запроса со * и union. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2018, 21:37 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
YuRock, Библиотека нормальная и запрос даже рабочий. Но DISQLite3 - коммерческая библиотека. DISQLite3 Personal, например, много чего не переваривает - нужен DISQLite3 Professional. И версия поновее. А получить кол-во записей для таблицы SQLite: Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2018, 22:49 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
DunkinYuRock, Библиотека нормальная и запрос даже рабочий. Но DISQLite3 - коммерческая библиотека. DISQLite3 Personal, например, много чего не переваривает - нужен DISQLite3 Professional. И версия поновее. А получить кол-во записей для таблицы SQLite: Код: pascal 1. да, такой запрос работает, это понятно!) выше я уже писал о том, что начал "городить этот огород" только потому, что не обнаружил более правильного (а в идеале - встроенного в компонент) способа заранее узнать кол-во записей в выборке... просто показалось странным и нелогичным после основного запроса, отдельно выполнять еще один точно такой же select, но у же с count(*) и попытался найти другое (пусть и далеко не изящное) решение... (насколько смог это сделать спустя неполные сутки изучения SQLlite) был бы рад просто услышать нечто вроде: "чувак, расслабься, в sqllite это невозможно! только отдельным повторным запросом или счетчиком в цикле по всей выборке..." и все, вопрос снят! еще вариант ответа: "если бы твоя компонента была версии "Pro", то возможно и запрос с union тоже бы сработал" (но ведь и Uniun запрос работает! (просто жаль, что моя компонента его не поддерживает) насколько он ужасен - не так принципиально! в конце-концов, программа должна решать поставленную задачу, а насколько изящен код, который ее решает - дело второстепенное, а уж конечному юзеру - вообще наплевать на это!) ну нет у меня столько свободного времени, чтобы думать над разного рода красивостями кода и изящностью подхода! Запрос составлен правильно - правильно! соответствует всем требованиям UNION и отлично отрабатывает = выдавая нужный результат! значит такой метод рабочий и тоже имеет место быть! У вас есть другой - более правильный/красивый - предложите. Объясните, чем ваш подход лучше, правильнее, быстрее... и почему) имхо, так было бы правильнее) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2018, 00:22 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
lx09x, зачем тебе вообще общее количество знать? В конкретно данном случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2018, 00:25 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
lx09x(но ведь и Uniun запрос работает! (просто жаль, что моя компонента его не поддерживает) насколько он ужасен - не так принципиально!Но это факт. Как и факт то, что эта прекрасная компонента его не поддерживает. Вопрос исчерпан, мне кажется. Уже посоветовали, как правильно посчитать записи простым нормальным запросом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2018, 00:49 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
lx09xУ вас есть другой - более правильный/красивый - предложите. Объясните, чем ваш подход лучше, правильнее, быстрее... и почему)Потому, что такие вещи проще делать серверу (хоть это и не сервер). Лучше и быстрее, чем тянуть на клиента и там считать. Очень много ненужных для этого операций выполняться будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2018, 00:52 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
чччДlx09x, зачем тебе вообще общее количество знать? В конкретно данном случае. все просто: для отображения в интерфейсе! результат поиска выводится в таблицу только по 12 строчек, плюс - имеются кнопочки для перехода к следующим/предыдущим 12 записям (эмуляция постраничного листания) юзер вводит поисковый запрос и БД возвращает, допустим, 9437 строк --- нужно же как-то сообщить ему об этом! что-то вроде: "обнаружено: 9437 совпадений (отображена 1 из 786 страниц результатов поиска)" вот для того, чтобы мне самому сперва посчитать- сколько же это будет в страницах, я должен знать сразу общее кол-во найденных строк! не могу же я просто отобразить ему табличку и предложить листать ее до конца (как долго - неизвестно)), пока не закончатся все строки, которые обнаружил Select... подобные вещи из разряда - "должны быть", имхо) жаль, что компонента не поддерживает Union (мне даже понравилось мое извращенное решение))) буду просто делать повторный запрос: select count(*) from... всем спасибо за объяснения и готовность помочь! вопрос исчерпан! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2018, 01:21 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
lx09xчччДlx09x, зачем тебе вообще общее количество знать? В конкретно данном случае. все просто: для отображения в интерфейсе! результат поиска выводится в таблицу только по 12 строчек, плюс - имеются кнопочки для перехода к следующим/предыдущим 12 записям (эмуляция постраничного листания) ... Ну вот смотри, грузишь ты очередные 12 строчек плюс еще одну. Если "еще одна" не грузится - то и следующих страниц нет, кнопку "дальше" показывать не надо. Иначе можно и кнопку показать. lx09x... юзер вводит поисковый запрос и БД возвращает, допустим, 9437 строк --- нужно же как-то сообщить ему об этом! что-то вроде: "обнаружено: 9437 совпадений (отображена 1 из 786 страниц результатов поиска)" ... Вот откажись от этой мысли, и жизнь станет проще. Ты ж не тупой яндекс какой-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2018, 01:30 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
lx09xподобные вещи из разрядафинтифлюшек "могу значит надо" lx09xпусть и далеко не изящное https://code.google.com/archive/p/txquery/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2018, 05:25 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
Попробуйте UNION ALL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2018, 09:05 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2018, 12:13 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
lx09x, Если лишнее поле не мешает, то можно попробовать вот так: http://www.mysqltutorial.org/mysql-row_number/ дальше - last , считать значение поля, затем first . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2018, 13:03 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
Belotsky Sergelx09x, Если лишнее поле не мешает, то можно попробовать вот так: http://www.mysqltutorial.org/mysql-row_number/ дальше - last , считать значение поля, затем first . PS: виноватъ, это другая СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2018, 13:15 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
lx09x, UNION работает в Professional версии. Получить кол-во записей в запросе - это выполнить ещё один запрос. Всё равно быстрее чем тянуть данные и пробегать по записям. Код проверен и работает и есть на stackoverflow. Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2018, 15:04 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
lx09xне обнаружил более правильного (а в идеале - встроенного в компонент) способа заранее узнать кол-во записей в выборке в SQL это вообще не гарантируется. По ряду причин. Самая простая - пока вы читаете ваши данные, кто-то (другая программа или другая часть вашей же программы) может вставить ещё больше данных. Или наоборот, удалить. И что тогда делать? вам пообещали 1000 строк, и их реально, столько и было. Но когда вы вычитали 990 строк, ситуация изменилась, и их стало 1005, или ещё хуже 995. И что делать? PS. на Торри должно быть до фига и больше библиотек для SQLite, начиная с неортодоксального mORMot ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2018, 19:19 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
AriochИ что делать?Читать доку к своему SQL серверу на предмет уровня изоляции транзакций? К тому же какие конкуренты во встраиваемой либе? И вообще те, кто пишет звездочки в запросе должны страдать, что мы и наблюдаем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2018, 20:55 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
Ivan_PisarevskyИ вообще те, кто пишет звездочки в запросе должны страдать, что мы и наблюдаем.Особенно те, кто говорит при этом "оно же и так работает"! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2018, 21:29 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
Ivan_PisarevskyК тому же какие конкуренты во встраиваемой либе? TQuery (точнее TDataSet) работают безотносительно деталей реализации и частностей вроде транзакций вот если он начнет напрямую SQLite API использовать - тогда возражение было бы резонным, если бы не Ariochили другая часть вашей же программы) может вставить ещё больше данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 14:59 |
|
||
|
при вставке sql-запроса в delphi -- ошибка, в sqlite expert все работает... помогите(
|
|||
|---|---|---|---|
|
#18+
В контексте задачи - решение такое: просто вычитать весь датасет (FetchAll) и там уже бегать по нему сколько влезет. Если, конечно, он кеширующий, а не лезет за данными каждой записи в либу. Это если памяти хватит. Вариант второй - несколькими запросами: первый - Count, последующие - select ... rows N to N+RowsOnPage. Но тогда есть вероятность изменения набора данных в процессе прохода по нему, не знаю уж, как в sqlite с транзакциями и есть ли у ТС параллельные запросы к базе. Насчет "советов" про бесполезность RecordCount - вот такие лентяи и придумали "бесконечные ленты", зависающий на середине скроллбар в гриде и прочую бесовщину. Чтоб у вас все встречающиеся скроллбары имели только три положения - начало, середина и конец! )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2018, 16:13 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39610363&tid=2041168]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
173ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 520ms |

| 0 / 0 |
