Решено. Помогите с SQLLite запросом к 2 таблицам...

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
kk_gor
Сообщения: 9
Зарегистрирован: 07 ноя 2013, 01:39

Решено. Помогите с SQLLite запросом к 2 таблицам...

Сообщение kk_gor » 06 апр 2014, 20:10

UPD. Решение.
Итак с помощью SQLiteStudio проверил рабочий вариант для моего случая, вот он:
Для примера отобрать только группы (... WHERE t1.TG=1).
[syntax=sql]SELECT * FROM kkb AS t1 LEFT JOIN (SELECT * FROM kkd WHERE IDCL = 3) AS t2 ON t1.ID = t2.IDPAR WHERE t1.TG=1[/syntax]
Благодарности:
KamiSempai за подсказку "LEFT JOIN";
Foenix за участие :)

Помогите с SQLLite запросом к 2 таблицам, или подтвердите невозможность такого запроса...
Есть 2 таблицы:
Таблица №1 - "kkb". Все возможные параметры.

Код: Выделить всё

ЄтоГрупа (t1.TG),КодПараметра(t1.ID),КодГрупыПараметра,НаименованиеПараметра
--------------------------------------------------------------------------
1,1,0,Группа №1
0,2,1,Параметр №1 Группы №1
0,3,1,Параметр №2 Группы №1
0,4,1,Параметр №3 Группы №1
1,5,0,Группа №2
0,6,5,Параметр №1 Группы №2
0,7,5,Параметр №2 Группы №2
0,8,5,Параметр №3 Группы №2
1,9,0,Группа №3
0,10,9,Параметр №1 Группы №3
0,11,9,Параметр №2 Группы №3
0,12,9,Параметр №3 Группы №3
Таблица №2 (kkd). Известные параметры

Код: Выделить всё

КодКлиента (t2.IDCL),КодПараметра (t2.IDPAR),Используется,Примечание
--------------------------------------------------------------------------
100, 1,1,Да, группа тоже может иметь примечание
100, 2,1,Примечание к Параметру №1 Группы №1
100, 7,1,Примечание к Параметру №2 Группы №2
201,10,1,Примечание к Параметр №1 Группы №3
201, 2,1,[пусто] //тут просто отмеченая галочка без примечания к Параметру №1 Группы №1
201, 7,1,[пусто] //тут просто отмеченая галочка без примечания к Параметру №2 Группы №2
Так вот, возможно ли сделать запрос который выдаст результат из объединенных таблиц в таком виде:
По 100 клиенту:
КодКлиента,КодПараметра,Используется (галочка),Примечание
--------------------------------------------------------------------------
100,1,1,Да, группа тоже может иметь примечание
100,2,1,Примечание к Параметру №1 Группы №1
100,3,0,[пусто] //Вот с этими строками и проблема...
100,4,0,[пусто] //... они должны быть в результате...
100,5,0,[пусто] //... для выгрузки их в курсор...
100,6,0,[пусто] //... чтобы при их изменении записыватся в таблицу №2
100,7,1,Примечание к Параметру №2 Группы №2

Вопросы:
1. Это вообще возможно сделать 1 запросом?
2. Если нет - возможно ли изменять даные в существующем курсоре,
например создаю в 1 проходе курсор из всех возможных параметров из Таблицы №1,
во втором проходе вношу в него изменения согласно существующим даным из Таблицы №2,
ну и только потом вывожу все это в активити...

Спасибо.
Последний раз редактировалось kk_gor 08 апр 2014, 13:47, всего редактировалось 2 раза.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Помогите с SQLLite запросом к 2 таблицам...

Сообщение KamiSempai » 06 апр 2014, 21:29

Кажется так:[syntax=sql]SELECT 100 as КодКлиента, T1.КодПараметра, T2.Используется, T2.Примечание FROM Table1 AS T1 LEFT JOIN (SELECT КодКлиента,КодПараметра,Используется,Примечание FROM Table2 WHERE КодКлиента = 100) AS T2 ON T1.КодПараметра = T2.КодПараметра;[/syntax]
100 лучше указать как параметр.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Помогите с SQLLite запросом к 2 таблицам...

Сообщение Foenix » 07 апр 2014, 06:47

вы сами составляли структуру таблиц?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

kk_gor
Сообщения: 9
Зарегистрирован: 07 ноя 2013, 01:39

Re: Помогите с SQLLite запросом к 2 таблицам...

Сообщение kk_gor » 08 апр 2014, 08:58

KamiSempai, спасибо - буду пробовать.

Foenix, да сам. И если что-то неправильно организовал - подскажите как правильнее.
С учетом того что "ВозможныхПараметров" может быть 200-300, поэтому и нужна группировка.
Поэтому - же и разбил на 2 базы, чтобы не хранить по каждому клиенту пустых 297 параметров если известно только 3.
Ну и в процессе могут появляться новые параметры, получается бегай ищи у кого нет такого пустого параметра.

Спасибо.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Помогите с SQLLite запросом к 2 таблицам...

Сообщение Foenix » 08 апр 2014, 11:35

да, таблицы неправильно организованы.
Я уже делала попытки объясниь как это правильно делать тут на форуме, к сожалению, у меня ничего не вышло, видиомо- формат форума не позволяет и народ не знает основ. По данным таблицам это очень хорошо заметно.
А так же, имхо, запрос Дениса не верный. Он не может быть верным потому что у вас структура таблиц такая.
Пожалуйста, почитайте основы, про нормальные формы, связи таблиц и так далее.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

kk_gor
Сообщения: 9
Зарегистрирован: 07 ноя 2013, 01:39

Re: Помогите с SQLLite запросом к 2 таблицам...

Сообщение kk_gor » 08 апр 2014, 13:57

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

Первое сделал для уменьшения количества файлов при импорте, поскольку он будет происходить часто и у меня 1 таблица = 1 файл (csv).
Кстати, если часто работаете с БД, подскажите какая у Вас длительность загрузки из текстового файла 15 000 записей длинной 100 байт на запись, ну или какая она должна быть. У меня 10-13 МИНУТ и транзакции не помогают :(

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Решено. Помогите с SQLLite запросом к 2 таблицам...

Сообщение Foenix » 08 апр 2014, 14:25

не транзакции нужно использовать, а batch
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Решено. Помогите с SQLLite запросом к 2 таблицам...

Сообщение Foenix » 08 апр 2014, 14:30

1. ни в одной таблице я не наблюдаю уникального идентификатора (тем более в 1й вы почему-то написали "не ID" - не понимаю чт о это значит)
2. первую таблицу нужно разбить на 2 - группы и параметры.
3. вторая таблица вообще не пойму что она означает. ID в ней тоже нет. ТАк не программируют уже лет 20. Поэтому я и спросила кто вам создавал структуру. Иной раз бывает "спущенная сверху" структура совершенно дебильная и не по правилам. Ну если вы ее сами изобрели, тогда извините.

Я вообще не понимаю как сейчас можно начинать делать таблицу не с поля _id
В таблицах должны быть ЯСНЫЕ связи между ними - поля такие как
таблица группы groups
_id .....другие поля
таблица параметры групп params
_id id_groups ....другие поля
таблица клиенты параметров
_id id_params ..... другие поля

хотите себя и других путать? делайте по-своему.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

kk_gor
Сообщения: 9
Зарегистрирован: 07 ноя 2013, 01:39

Re: Решено. Помогите с SQLLite запросом к 2 таблицам...

Сообщение kk_gor » 08 апр 2014, 15:09

Foenix писал(а):1. ни в одной таблице я не наблюдаю уникального идентификатора (тем более в 1й вы почему-то написали "не ID" - не понимаю чт о это значит)
"_ID" есть во всех таблицах, просто я его не использую, теоритически вместо базового "_ID" я могу посунуть свои "ID", который получаю из входящего CSV, но я не могу быть уверен в его уникальности, что обязательно для "_ID"
Foenix писал(а):2. первую таблицу нужно разбить на 2 - группы и параметры.
Согласен. :(
Foenix писал(а):3. вторая таблица вообще не пойму что она означает. ID в ней тоже нет.
[syntax=sql]CREATE TABLE kkd (
_id INTEGER PRIMARY KEY AUTOINCREMENT,
UPDATES TEXT, //Когда обновилась запись
IDCL INTEGER, //Код Клиента
IDPAR INTEGER, //Код Параметра
USED INTEGER, //"Галочка"
HINT TEXT //Примечание
);[/syntax]
Foenix писал(а):ТАк не программируют уже лет 20....
Возможно в этом и основная проблема :( Работал еще в FoxPro,
и воозможно это его влияние...
Foenix писал(а):хотите себя и других путать? делайте по-своему.
У меня выбора нет :) Я специально на програмисста и БДшника не учился,
а сделать "надо"... и за копейку - значит самому :(

Но всеравно спасибо за участие :)
Удачи!

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Решено. Помогите с SQLLite запросом к 2 таблицам...

Сообщение Foenix » 08 апр 2014, 15:16

при заполнении таблиц откуда бы ни было нужно записывать свой инкрементный _id, затем, при заполнении второстепенных, зависимых таблиц организовывать в них ссылку на _id в первой таблице по всем правилам. Не использовать его нельзя. Раз вы не уверены в "приходящих" id, то нужно сделать именно так, потому что иначе будут ошибки в запросах далее.

Я тоже работала и работаю с фоксом, это дела не меняет. Раз вы не учились, то придется вначале подучиться.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

kk_gor
Сообщения: 9
Зарегистрирован: 07 ноя 2013, 01:39

Re: Решено. Помогите с SQLLite запросом к 2 таблицам...

Сообщение kk_gor » 08 апр 2014, 16:32

Ну вот конкретно в этом случае это СИЛЬНО усложнит логику импорта...
1. Причина - мои ID, в отличии от "_ID" могут быть НЕ инкрименентные, если ненужный ID удалят из главной базы :( "1,2,3,4" - "_ID" приймет нормально, а "1,2,4" - не уверен...
2. Все входящие таблицы уже "связаны" по своих "ID", соответственно их нужно просто импортировать.
Если же перерабатывать связи по внутренних "_ID" таблиц это создавать большой кусок логики при импорте...
Мне кажется что намного легче в SQL запросах работать с своими полями... Хотя, возможно, в будущем мне все это вылезет боком...

А учится... Никто столько времени не дает... Поэтому и спрашиваю знающих об очередных граблях, которые возникают во время выполнения поставленой задачи...

А за "batch", спасибо... буду почитать...
Удачи!

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Решено. Помогите с SQLLite запросом к 2 таблицам...

Сообщение Foenix » 08 апр 2014, 17:10

не важно что они не инкрементные. Если они УНИКАЛЬНЫЕ то уже можно брать их. Но все равно я бы в каждую таблицу добавила и _id и серверный id (я так и делаю собственно у себя).
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Решено. Помогите с SQLLite запросом к 2 таблицам...

Сообщение KamiSempai » 08 апр 2014, 18:26

kk_gor писал(а):Работал еще в FoxPro
Я тоже в нем работал, однако, на меня это не сильно повлияло.
На такое количество говнокода за это время насморелся... И еще прикольно было когда я сильно раскритовал исходники одной программы перед своей начальницей, а потом оказалось, что это она писала... Я об этом уже по ее лицу догадался :D
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

kk_gor
Сообщения: 9
Зарегистрирован: 07 ноя 2013, 01:39

Re: Решено. Помогите с SQLLite запросом к 2 таблицам...

Сообщение kk_gor » 09 апр 2014, 09:20

KamiSempai писал(а):На такое количество говнокода за это время насморелся...
Чтото мне это напоминает :) - "Ктобы не писал код (устанавливал виндовс) до нас 100%
делал это не правильно! Даже если это делали мы год назад :)"

А вообще интересно, существуют ли программисты, со стажем работы больше 5 лет,
которые не критиковали код начальства :) Даже у меня, украинского, сельського самоучки, это было :)

Всем спасибо, наступлю на очередные грабли - напишу.
Удачи!

ЗЫ.
"_id" во всех таблицах есть! Иначе курсор жеж работать не будет :)

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Решено. Помогите с SQLLite запросом к 2 таблицам...

Сообщение Foenix » 09 апр 2014, 10:13

kk_gor писал(а): "_id" во всех таблицах есть! Иначе курсор жеж работать не будет :)
Он не для этого нужен, курсору на _id вообще-то наплевать)
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

kk_gor
Сообщения: 9
Зарегистрирован: 07 ноя 2013, 01:39

Re: Решено. Помогите с SQLLite запросом к 2 таблицам...

Сообщение kk_gor » 09 апр 2014, 10:45

Foenix писал(а):Он не для этого нужен, курсору на _id вообще-то наплевать)
Проштудировав этот (cursorloader) урок http://startandroid.ru/ru/uroki/vse-uro ... oader.html, почемуто подумал что он обязателен...
И точно помню что в каком-то из ранних уроков писалось что это поле ОБЯЗАТЕЛЬНО для баз на Андроиде...

Удачи.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Решено. Помогите с SQLLite запросом к 2 таблицам...

Сообщение Foenix » 09 апр 2014, 11:33

да, обязательно для таблиц, обязательно _id для listview, но курсор тут не причем :) Это всего лишь какие-то данные, результат выборки в памяти.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

kk_gor
Сообщения: 9
Зарегистрирован: 07 ноя 2013, 01:39

Re: Решено. Помогите с SQLLite запросом к 2 таблицам...

Сообщение kk_gor » 10 апр 2014, 18:43

Заработался... Уж точно "Утро - вечера мудренее". С утра нашел все что нужно...

Ответить