|
Как сделать запрос с предикатом, который в таблице?
|
|||
---|---|---|---|
#18+
Есть 2 таблицы, одна со ссылками, описанием ссылок и командами, а вторая с предикатами и командами. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
После добавления новой ссылки "Link" в таблицу "Links" мне нужно добавить в таблицу "Links" еще и значение "Command", которое должно быть взято из таблицы "Predicats". Должно быть взято значение, которое соответствует предикату, с помощью которого можно найти добавленную запись. Например, я добавляю новую запись INSERT INTO Links (Link, Description) VALUES ('Link11', 'Text11'); После этого нужен запрос, который установит значение "Command1" в столбец "Command" для строки "Link11" Т.е. нужно перебрать предикаты из таблицы Predicats и взять значение "Command" из той строки, по которой нашлась строка "Link11" ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2020, 22:06 |
|
Как сделать запрос с предикатом, который в таблице?
|
|||
---|---|---|---|
#18+
Vovsla ...Т.е. нужно перебрать предикаты из таблицы Predicats и взять значение "Command" из той строки, по которой нашлась строка "Link11" почти в любом языке программирование есть конструкция for ))) note: странная задача, еще более странная структура данных (наполнение этих данных) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2020, 13:45 |
|
Как сделать запрос с предикатом, который в таблице?
|
|||
---|---|---|---|
#18+
Vovsla Есть 2 таблицы, одна со ссылками, описанием ссылок и командами, а вторая с предикатами и командами. Vovsla После добавления новой ссылки "Link" в таблицу "Links" мне нужно добавить в таблицу "Links" еще и значение "Command", которое должно быть взято из таблицы "Predicats". Должно быть взято значение, которое соответствует предикату, с помощью которого можно найти добавленную запись. Vovsla Например, я добавляю новую запись INSERT INTO Links (Link, Description) VALUES ('Link11', 'Text11'); После этого нужен запрос, который установит значение "Command1" в столбец "Command" для строки "Link11" Т.е. нужно перебрать предикаты из таблицы Predicats и взять значение "Command" из той строки, по которой нашлась строка "Link11" ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2020, 17:47 |
|
Как сделать запрос с предикатом, который в таблице?
|
|||
---|---|---|---|
#18+
Vovsla Есть 2 таблицы, одна со ссылками, описанием ссылок и командами, а вторая с предикатами и командами. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
После добавления новой ссылки "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%. Это намеренно? Выглядит стремно. - команда находится один раз во время вставки и запоминается. Если таблица предикатов меняется (напр., исправляется ошибка), то команда уже запомнена и не изменится. Обычно так не делают, а подбирают команду из таблицы предикатов в момент когда она понадобится. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2020, 19:33 |
|
Как сделать запрос с предикатом, который в таблице?
|
|||
---|---|---|---|
#18+
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.
Повторяю, что пример грубый, можно было сделать временную таблицу, где есть только вставленная строка и по ней подбирать предикат, но это усложнило бы пример. Неофит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%. Это намеренно? Выглядит стремно. - команда находится один раз во время вставки и запоминается. Если таблица предикатов меняется (напр., исправляется ошибка), то команда уже запомнена и не изменится. Обычно так не делают, а подбирают команду из таблицы предикатов в момент когда она понадобится. - это всего лишь пример, там могут быть любые строки - Да, это намеренно. Не вижу ничего стремного :) - Получить заранее прописанную команду - это самый быстрый способ ее узнать. При изменении команды в таблице предикатов будет изменены команды и в таблице ссылок, это очень просто, с этим вопросов нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2020, 21:49 |
|
Как сделать запрос с предикатом, который в таблице?
|
|||
---|---|---|---|
#18+
Vovsla, Я теперь понимаю ваши цели немного лучше. Если у вас предикаты уже в формате условия "where", и вам нужна максимальная гибкость при построении предикатов, то динамический SQL должен помочь. С его помощью SQL команда строится как строка, и затем исполняется через интерпретатор. С точки зрения архитектуры, у меня сомнения что запросы по коллекции будут исполняться эффективно. Скорее - полным перебором. Чем Уже язык написания предикатов, тем больше возможностей для оптимизации. Например, если предикаты укладываются в regular expressions, то можно отказаться от динамического SQL. Если ещё проще - возможно Oracle Text способен вашу задачу обработать очень эффективно. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 03:03 |
|
Как сделать запрос с предикатом, который в таблице?
|
|||
---|---|---|---|
#18+
НеофитSQL, Спасибо за совет, почитаю про динамический SQL и Oracle Text. Хотя, программа уже написана с использованием SQLite, а таблица с предикатами нужна для реализации дополнительного функционала. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 12:01 |
|
Как сделать запрос с предикатом, который в таблице?
|
|||
---|---|---|---|
#18+
Что общего между SqlLite (!!!!), Dinamic SQL и ORACLE (б#$%ть!!!) Text ? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 19:03 |
|
Как сделать запрос с предикатом, который в таблице?
|
|||
---|---|---|---|
#18+
НеофитSQL, У меня никакого заблуждения нет. Я понял, что с помощью SQLite это вряд ли получится реализовать, поэтому нужно либо менять движок базы данных, на один из тех, которые Вы предложили, либо выносить реализацию за SQLite как в примере с циклом. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2020, 19:28 |
|
Как сделать запрос с предикатом, который в таблице?
|
|||
---|---|---|---|
#18+
Vovsla Мне нужно: Нарисуй начальную таблицу. Потом скажи "добавляем то-то туда-то" Нарисуй конечную таблицу. Это будет намного понятней в объяснении что ты хочешь. (надеюсь). ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2020, 20:51 |
|
Как сделать запрос с предикатом, который в таблице?
|
|||
---|---|---|---|
#18+
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 ___| ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 00:14 |
|
Как сделать запрос с предикатом, который в таблице?
|
|||
---|---|---|---|
#18+
А если добавили строчку Link12, то что должно быть в Command ? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 01:11 |
|
Как сделать запрос с предикатом, который в таблице?
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevА если добавили строчку Link12, то что должно быть в Command ? Команда, которая соответствует первому подходящему предикату - Command1. Но если в SQLite будет проблема с остановкой перебора, то пусть будет Command2, это не принципиально ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 20:26 |
|
Как сделать запрос с предикатом, который в таблице?
|
|||
---|---|---|---|
#18+
Vovsla Т.е. добавленную строку можно найти с помощью запроса "SELECT * FROM Links WHERE (Link LIKE '%1%')" И нет, ответ "любой" не подходит, потому что конфликтует с самим понятием SQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2020, 01:13 |
|
Как сделать запрос с предикатом, который в таблице?
|
|||
---|---|---|---|
#18+
White Owl ....потому что конфликтует с самим понятием SQL. На SQL ее все равно не сделать. Т.ч. пофиг ))) Задача должна/может решаться исключительно на host языке, куда прилинкован SQL Lite. Ну и да: 1) самой задачи (в терминах бизнеса, а не непонятных таблиц) мы не знаем. 2) почему выбрана такая странная структура базы и кому пришла идея хранить в базе готовые куски селектов - мы не знаем так же. Вообще, такие вопросы нужно задавать не на форуме, а тому, кто такую базу запроектировал. Пусть анал итик, который запроектировал, за результат своего анал иза сам и отвечает. IMHO & AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2020, 08:32 |
|
|
start [/forum/topic.php?fid=54&gotonew=1&tid=2008347]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
14ms |
get first new msg: |
9ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 164ms |
0 / 0 |