Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
30.09.2014, 06:55
|
|||
---|---|---|---|
|
|||
Пересечение таблиц |
|||
#18+
Добрый день всем. Есть три таблицы A, B, и С. Есть связь (допустим 1:1) B.IDa=A.ID и C.IDa=A.ID И ещё связь (один ко многим) C.IDb = B.ID. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Делается выборка (назовем её Т) из таблицы A, следовательно, мне нужно выбрать связанные записи из таблицы B, но B косвенно связана ещё с другими записями из таблицы A т.е. Код: sql 1. 2. 3. 4. 5.
;если честно, не проверял этот запрос Результат этого запроса, также добавляется в выборку T и получается необходимо проделывать это снова и снова, пока количество добавляемых записей не будет = 0. Вопрос, реально сделать проще? Одним-двумя запросами. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.10.2014, 06:50
|
|||
---|---|---|---|
Пересечение таблиц |
|||
#18+
Во первых, у тебя потенциальная проблема в таблице C. Может получиться так, что С->IDa показывает на одну запись в A, а C->IDb->IDa показывает на другую запись в A. Что ты будешь делать в этом случае? Во вторых, а вопрос то в чем? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.10.2014, 07:29
|
|||
---|---|---|---|
|
|||
Пересечение таблиц |
|||
#18+
White OwlВо первых, у тебя потенциальная проблема в таблице C. Может получиться так, что С->IDa показывает на одну запись в A, а C->IDb->IDa показывает на другую запись в A. Что ты будешь делать в этом случае? Да, такое может быть и правильно. Можно даже сказать в этом и состоит вопрос. Ситуация следующая, пользователь делает выборку из таблицы А, мне надо программно сделать выборку из таблицы B, по связи B.IDa=>A.ID, здесь проблем нет. Но записи в таблицы B связаны ещё из другими записями из таблицы А (но не напрямую, а через таблицу С). Следовательно, мне надо, добавить в пользовательскую выборку дополнительные записи из таблицы А (C.IDa=>A.ID). (тот запрос из первого сообщения как раз это и делает (просто я UPDATE не стал писать)). Фишка в том, что после этого у меня получается новая "пользовательская" выборка из таблицы А. Ну как бы надо повторять всё заново, можно сделать это программно, в цикле. Вопрос: Можно ли сделать это с помощью SQL? если можно, то как? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.10.2014, 07:37
|
|||
---|---|---|---|
|
|||
Пересечение таблиц |
|||
#18+
В первом сообщении неправильно написал. Связь С.IDa=A.ID один ко многим. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.10.2014, 18:23
|
|||
---|---|---|---|
Пересечение таблиц |
|||
#18+
И все-же объясни (чрезвычайно желательно с примерами) что именно ты хочешь выбрать? Что запрашивает пользователь и что он должен получить? И при чем здесь update? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 05:25
|
|||
---|---|---|---|
|
|||
Пересечение таблиц |
|||
#18+
Ок. попробую ещё раз. К черту эти ABC... Программа связана с мат. моделированием. Есть три таблицы. 1)Временные ряды(dtSets) 2)модели(dtModels) они содержат ссылки на временные ряды, как на функцию(IDSet) и как на аргументы (таблица аргументов). 3)ну и соответственно есть таблица аргументов (dtArguments) это либо другие временные ряды, либо тот же самый ряд, к которому принадлежит модель. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Пользователь хочет выбрать несколько рядов и сохранить их в «наш» файловый формат. Это происходит по нескольким запросам, поэтому я создаю временную таблицу (TempSets) идентичную dtSets. Вместе с временными рядами мне надо также сохранить их модели. Выбрать модели по связи dtModels.IDSet=dtSets.ID я могу. Как я говорил, модель может содержать другие ряды (т.е. как аргументы), которые пользователь не выбирал напрямую, но их надо добавить в TempSets: Код: sql 1. 2. 3. 4. 5. 6.
После этого у меня получается новый TempSets, который ссылается на новые модели, которые в свою очередь имеют новые аргументы. Получается мне надо повторять этот запрос снова и снова. Попробую пример показать: Временные ряды ID NameSet1A2B3C4D5E6X7Y8Z Модели IDIDSetName11ModelA22ModelB33ModelC44ModelD55modelE Аргументы IDIDModelIDSet111212324425525631743855 Пользователь выбрал ряды: TempSets ID NameSet1A Значит, мне надо сохранить модель ModelA. Она имеет следующие аргументы: IDIDModelIDSet111212 Добавляем в пользовательскую выборку недостающие ряды: TempSets ID NameSet1A2B Т.е. надо уже сохранять две модели: ModelA, ModelB. Смотрим их аргументы: IDIDModelIDSet111212324425525 Таким образом, мне надо ещё добавить временные ряды D и E. TempSets ID NameSet1A2B4D5E Ну и так далее. Вопрос. Реально обойтись без цикла? И сделать всё в SQL? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 07:38
|
|||
---|---|---|---|
|
|||
Пересечение таблиц |
|||
#18+
А вообще ладно, проехали. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 18:34
|
|||
---|---|---|---|
Пересечение таблиц |
|||
#18+
Volume05, Реально, это рекурсивный запрос должен быть. На SQLite не пробовал такие писать, но если хотите ищите по SQLite CTE ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.10.2014, 19:38
|
|||
---|---|---|---|
Пересечение таблиц |
|||
#18+
Вроде что-то похожее выдаёт, вообщем надо проверить. Пользовался официальной документацией Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Результат выборки IDNameSet1A2B4D5E3C Для проверки можно воспользоваться вот такой "лесенкой" Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
03.10.2014, 08:56
|
|||
---|---|---|---|
|
|||
Пересечение таблиц |
|||
#18+
VSVLAD, Ухты. не ожидал такого подробного ответа. Спасибо. Реальные таблицы у меня, чуть сложнее, да и ещё не разобрался с этими запросами, но думаю должно сработать. По крайней мере, для описанного примера, твой запрос работает и на моих таблицах. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
03.10.2014, 18:41
|
|||
---|---|---|---|
Пересечение таблиц |
|||
#18+
Volume05Ну и так далее. Вопрос. Реально обойтись без цикла? И сделать всё в SQL?Не вижу смысла делать это в SQL. При такой организации данных у тебя может быть гигантский результат, вплоть до полного дампа всех трех таблиц. Лучше делать это все с клиента по частям, по отдельным запросам. Пользователь запросил SetA? Нарисуй ему этот сэт и рядышком кнопочку: "Показать модели в которых этот сэт используется". По ее нажатию показать список моделей, и к нему кнопочку "показать сэты используемые в отмеченных моделях". Ну и тд... Либо в каком-либо другом виде, типа zoom in/out. Или что там более подходит по предметной области? Если на запрос одного конкретного сэта у тебя будет всегда выдаваться еще и все связанные с ним - то пользователь потонет в данных. Ну а если уж действительно настолько сильно нужно вытащить все разом, то проще циклом с клиента. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
03.10.2014, 19:46
|
|||
---|---|---|---|
|
|||
Пересечение таблиц |
|||
#18+
White Owl, Спасибо. Тут такое дело, для меня сложно понять какой вариант лучше, пока не испытаю. White OwlПри такой организации данных у тебя может быть гигантский результат, вплоть до полного дампа всех трех таблиц. По идеи не должно быть так. Грубо говоря, сэты в одном регионе замыкаются на глобальные характеристики у которых либо авторегрессионные, либо трендовые модели. White Owl Лучше делать это все с клиента по частям, по отдельным запросам. Пользователь запросил SetA? Нарисуй ему этот сэт и рядышком кнопочку: "Показать модели в которых этот сэт используется". По ее нажатию показать список моделей, и к нему кнопочку "показать сэты используемые в отмеченных моделях". Ну и тд... Либо в каком-либо другом виде, типа zoom in/out. Или что там более подходит по предметной области? Что-то подобное есть, но тут именно нужно сохранить "полные" данные. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=54&tablet=1&tid=2008743]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
55ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 165ms |
0 / 0 |