powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как сделать запрос с предикатом, который в таблице?
15 сообщений из 15, страница 1 из 1
Как сделать запрос с предикатом, который в таблице?
    #40015751
Vovsla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 2 таблицы, одна со ссылками, описанием ссылок и командами, а вторая с предикатами и командами.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE IF NOT EXISTS Links (Link VARCHAR NOT NULL UNIQUE, Description VARCHAR, Command VARCHAR));
CREATE TABLE IF NOT EXISTS Predicats (Predicate VARCHAR NOT NULL UNIQUE, Command VARCHAR));

INSERT INTO Links (Link, Description) VALUES ('Link1', 'Text1');
INSERT INTO Links (Link, Description) VALUES ('Link2', 'Text2');
INSERT INTO Links (Link, Description) VALUES ('Link3', 'Text3');

INSERT INTO Predicats VALUES ('Link LIKE ''%1%''', 'Command1');
INSERT INTO Predicats VALUES ('Link LIKE ''%2%''', 'Command2');
INSERT INTO Predicats VALUES ('Link LIKE ''%3%''', 'Command3');



После добавления новой ссылки "Link" в таблицу "Links" мне нужно добавить в таблицу "Links" еще и значение "Command", которое должно быть взято из таблицы "Predicats". Должно быть взято значение, которое соответствует предикату, с помощью которого можно найти добавленную запись.

Например, я добавляю новую запись
INSERT INTO Links (Link, Description) VALUES ('Link11', 'Text11');
После этого нужен запрос, который установит значение "Command1" в столбец "Command" для строки "Link11"
Т.е. нужно перебрать предикаты из таблицы Predicats и взять значение "Command" из той строки, по которой нашлась строка "Link11"
...
Рейтинг: 0 / 0
Как сделать запрос с предикатом, который в таблице?
    #40015935
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vovsla

...Т.е. нужно перебрать предикаты из таблицы Predicats и взять значение "Command" из той строки, по которой нашлась строка "Link11"


почти в любом языке программирование есть конструкция for )))

note: странная задача, еще более странная структура данных (наполнение этих данных)
...
Рейтинг: 0 / 0
Как сделать запрос с предикатом, который в таблице?
    #40016051
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vovsla
Есть 2 таблицы, одна со ссылками, описанием ссылок и командами, а вторая с предикатами и командами.
На всякий случай: предикат = predicate. И множественное число будет predicates.

Vovsla
После добавления новой ссылки "Link" в таблицу "Links" мне нужно добавить в таблицу "Links" еще и значение "Command", которое должно быть взято из таблицы "Predicats". Должно быть взято значение, которое соответствует предикату, с помощью которого можно найти добавленную запись.
Как именно "соответствует"? И что значит "добавить в таблицу "Links"? Это ты собираешься добавить первую строку, потом добавить для нее соответствующий конструкт из предиката, потом на добавленную строку найти и добавить третью строку с двойным предикатом, потом четвертую с тройным и тд.... Остановимся когда памяти не хватит, да?

Vovsla
Например, я добавляю новую запись
INSERT INTO Links (Link, Description) VALUES ('Link11', 'Text11');
После этого нужен запрос, который установит значение "Command1" в столбец "Command" для строки "Link11"
Т.е. нужно перебрать предикаты из таблицы Predicats и взять значение "Command" из той строки, по которой нашлась строка "Link11"
А где у тебя в Predicats строка "Link11"?
...
Рейтинг: 0 / 0
Как сделать запрос с предикатом, который в таблице?
    #40016091
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vovsla
Есть 2 таблицы, одна со ссылками, описанием ссылок и командами, а вторая с предикатами и командами.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE IF NOT EXISTS Links (Link VARCHAR NOT NULL UNIQUE, Description VARCHAR, Command VARCHAR));
CREATE TABLE IF NOT EXISTS Predicats (Predicate VARCHAR NOT NULL UNIQUE, Command VARCHAR));

INSERT INTO Links (Link, Description) VALUES ('Link1', 'Text1');
INSERT INTO Links (Link, Description) VALUES ('Link2', 'Text2');
INSERT INTO Links (Link, Description) VALUES ('Link3', 'Text3');

INSERT INTO Predicats VALUES ('Link LIKE ''%1%''', 'Command1');
INSERT INTO Predicats VALUES ('Link LIKE ''%2%''', 'Command2');
INSERT INTO Predicats VALUES ('Link LIKE ''%3%''', 'Command3');



После добавления новой ссылки "Link" в таблицу "Links" мне нужно добавить в таблицу "Links" еще и значение "Command", которое должно быть взято из таблицы "Predicats". Должно быть взято значение, которое соответствует предикату, с помощью которого можно найти добавленную запись.

Например, я добавляю новую запись
INSERT INTO Links (Link, Description) VALUES ('Link11', 'Text11');
После этого нужен запрос, который установит значение "Command1" в столбец "Command" для строки "Link11"
Т.е. нужно перебрать предикаты из таблицы Predicats и взять значение "Command" из той строки, по которой нашлась строка "Link11"


Я бы написал что-то вроде:

:link = 'Link55';
INSERT INTO Links (Link, Description) VALUES (:link, (select max(p.Command) from Predicates p where :link like p.Predicate));

Но есть вопросы:
- предикаты написаны с повторяющимся префиксом, я ожидал бы 'Link001', 'Lnk002', ...
- структура предикатов и использование процентов позволяет множественные совпадения: Link11 совпадет с %Link1% а также с %HotLink11%. Это намеренно? Выглядит стремно.
- команда находится один раз во время вставки и запоминается. Если таблица предикатов меняется (напр., исправляется ошибка), то команда уже запомнена и не изменится. Обычно так не делают, а подбирают команду из таблицы предикатов в момент когда она понадобится.
...
Рейтинг: 0 / 0
Как сделать запрос с предикатом, который в таблице?
    #40016129
Vovsla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlА где у тебя в Predicats строка "Link11"?

В Predicats нет строки "Link11", она добавляется в таблицу Links
INSERT INTO Links (Link, Description) VALUES ('Link11', 'Text11');

White OwlКак именно "соответствует"? И что значит "добавить в таблицу "Links"? Это ты собираешься добавить первую строку, потом добавить для нее соответствующий конструкт из предиката, потом на добавленную строку найти и добавить третью строку с двойным предикатом, потом четвертую с тройным и тд.... Остановимся когда памяти не хватит, да?


Мне нужно:
Добавить строку - INSERT INTO Links (Link, Description) VALUES ('Link11', 'Text11');
Потом выяснить по какому из предикатов, которые находятся в столбце "Predicate " можно найти эту добавленную строку.
Если найден подходящий предикат, то нужно взять значение "Command" этого предиката и прописать в значение "Command" добавленной строки.
После этого действие останавливается.

Т.е. исходя из представленных данных после добавление строки
INSERT INTO Links (Link, Description) VALUES ('Link11', 'Text11');
В столбец "Command" этой строки должно быть добавлено значение "Command1" т.к. эту добавленную строку можно найти по предикату ('Link LIKE ''%1%''')

Это можно реализовать путем вывода перебора за рамки SQL запроса, но тогда это будет медленно работать.
Вот грубый пример внешней реализации.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
$Link = 'Link11' - присваиваем переменной $Link значение 'Link11'
$Text = 'Text11' - присваиваем переменной $Text значение 'Text11'

INSERT INTO Links (Link, Description) VALUES ($Link, $Text); - добавляем новую запись в SQL таблицу

$PredArr = SELECT * FROM Predicats; - получаем двумерный массив со значениями Predicate и Command.

Перебираем массив в поиске подходящего предиката
For $Num = 0 To Ubound($PredArr)
   $Result = SELECT * FROM Links WHERE ($PredArr[0][$Num]); - в массиве [0] - номер столбца, [$Num] - перебираем номера строк
   If $Result > 0 Then - узнали, что по предикату ('Link LIKE ''%1%''') что-то нашлось
      UPDATE Links SET Command = $PredArr[1][$Num] WHERE Link = $Link; - прописали в столбец "Command" значение "Command1"
      ExitLoop
   EndIf
Next


Повторяю, что пример грубый, можно было сделать временную таблицу, где есть только вставленная строка и по ней подбирать предикат, но это усложнило бы пример.


НеофитSQLЯ бы написал что-то вроде:
:link = 'Link55';
INSERT INTO Links (Link, Description) VALUES (:link, (select max(p.Command) from Predicates p where :link like p.Predicate));

Так не пойдет, так мы сравниваем саму ссылку с предикатом, а не проверяем можно ли по предикату найти строку.
Предикат может быть и таким - 'Link LIKE '%1%' AND Description LIKE '%ext%'


НеофитSQLНо есть вопросы:
- предикаты написаны с повторяющимся префиксом, я ожидал бы 'Link001', 'Lnk002', ...
- структура предикатов и использование процентов позволяет множественные совпадения: Link11 совпадет с %Link1% а также с %HotLink11%. Это намеренно? Выглядит стремно.
- команда находится один раз во время вставки и запоминается. Если таблица предикатов меняется (напр., исправляется ошибка), то команда уже запомнена и не изменится. Обычно так не делают, а подбирают команду из таблицы предикатов в момент когда она понадобится.

- это всего лишь пример, там могут быть любые строки
- Да, это намеренно. Не вижу ничего стремного :)
- Получить заранее прописанную команду - это самый быстрый способ ее узнать. При изменении команды в таблице предикатов будет изменены команды и в таблице ссылок, это очень просто, с этим вопросов нет.
...
Рейтинг: 0 / 0
Как сделать запрос с предикатом, который в таблице?
    #40016164
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vovsla,

Я теперь понимаю ваши цели немного лучше.

Если у вас предикаты уже в формате условия "where", и вам нужна максимальная гибкость при построении предикатов, то динамический SQL должен помочь. С его помощью SQL команда строится как строка, и затем исполняется через интерпретатор.

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

Чем Уже язык написания предикатов, тем больше возможностей для оптимизации. Например, если предикаты укладываются в regular expressions, то можно отказаться от динамического SQL. Если ещё проще - возможно Oracle Text способен вашу задачу обработать очень эффективно.
...
Рейтинг: 0 / 0
Как сделать запрос с предикатом, который в таблице?
    #40016187
Vovsla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL,

Спасибо за совет, почитаю про динамический SQL и Oracle Text.
Хотя, программа уже написана с использованием SQLite, а таблица с предикатами нужна для реализации дополнительного функционала.
...
Рейтинг: 0 / 0
Как сделать запрос с предикатом, который в таблице?
    #40016237
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что общего между SqlLite (!!!!), Dinamic SQL и ORACLE (б#$%ть!!!) Text ?
...
Рейтинг: 0 / 0
Как сделать запрос с предикатом, который в таблице?
    #40016368
Vovsla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL,

У меня никакого заблуждения нет. Я понял, что с помощью SQLite это вряд ли получится реализовать, поэтому нужно либо менять движок базы данных, на один из тех, которые Вы предложили, либо выносить реализацию за SQLite как в примере с циклом.
...
Рейтинг: 0 / 0
Как сделать запрос с предикатом, который в таблице?
    #40016372
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vovsla

Мне нужно:


Нарисуй начальную таблицу.
Потом скажи "добавляем то-то туда-то"
Нарисуй конечную таблицу.

Это будет намного понятней в объяснении что ты хочешь. (надеюсь).
...
Рейтинг: 0 / 0
Как сделать запрос с предикатом, который в таблице?
    #40016693
Vovsla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlНарисуй начальную таблицу.

Таблица Links
|_ Link __|_ Description _|____ Command ___|
|_ Link1 _|___ Text1 ___|________________|
|_ Link2 _|___ Text2 ___|________________|
|_ Link3 _|___ Text3 ___|________________|

Таблица Predicates
|______ Predicate ____|__ Command _|
|__ Link LIKE '%1%' __|_ Command1 _|
|__ Link LIKE '%2%' __|_ Command2 _|
|__ Link LIKE '%3%' __|_ Command3 _|


В таблицу Links добавляем строку Link11 и получаем
|_ Link ___|_ Description _|____ Command ____|
|_ Link1 __|___ Text1 ____|________________|
|_ Link2 __|___ Text2 ____|________________|
|_ Link3 __|___ Text3 ____|________________|
|_ Link11 _|___ Text11 ___|________________|

Теперь нужно выяснить по какому из предикатов, которые указаны в таблице Predicates можно найти добавленную строку.
А после нахождения подходящего предиката нужно в таблицу Links добавить команду, которая соответствует найденному предикату
Т.е. добавленную строку можно найти с помощью запроса "SELECT * FROM Links WHERE (Link LIKE '%1%')", этому предикату соответствует команда "Command1", значит это значение нужно добавить к добавленной строке.
В итоге должно получиться
|_ Link ___|_ Description _|_____ Command ___|
|_ Link1 __|___ Text1 ____|________________|
|_ Link2 __|___ Text2 ____|________________|
|_ Link3 __|___ Text3 ____|________________|
|_ Link11 _|___ Text11 ___|____ Command1 ___|
...
Рейтинг: 0 / 0
Как сделать запрос с предикатом, который в таблице?
    #40016698
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если добавили строчку Link12, то что должно быть в Command ?
...
Рейтинг: 0 / 0
Как сделать запрос с предикатом, который в таблице?
    #40016950
Vovsla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid KudryavtsevА если добавили строчку Link12, то что должно быть в Command ?
Команда, которая соответствует первому подходящему предикату - Command1.
Но если в SQLite будет проблема с остановкой перебора, то пусть будет Command2, это не принципиально
...
Рейтинг: 0 / 0
Как сделать запрос с предикатом, который в таблице?
    #40017000
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vovsla

Т.е. добавленную строку можно найти с помощью запроса "SELECT * FROM Links WHERE (Link LIKE '%1%')"
А если в таблицу Links добавить "Link123", то ее можно будет найти с помощью любого из трех представленных предикатов. И какой тогда использовать?
И нет, ответ "любой" не подходит, потому что конфликтует с самим понятием SQL.
...
Рейтинг: 0 / 0
Как сделать запрос с предикатом, который в таблице?
    #40017023
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
....потому что конфликтует с самим понятием SQL.


На SQL ее все равно не сделать. Т.ч. пофиг )))
Задача должна/может решаться исключительно на host языке, куда прилинкован SQL Lite.

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

Вообще, такие вопросы нужно задавать не на форуме, а тому, кто такую базу запроектировал. Пусть анал итик, который запроектировал, за результат своего анал иза сам и отвечает. IMHO & AFAIK
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как сделать запрос с предикатом, который в таблице?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (12): Анонимы (8), Bing Bot, Yandex Bot 1 мин., Google Bot 1 мин., CerebroSQL 3 мин.
x
x
Закрыть


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