|
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
|
|||
---|---|---|---|
#18+
Добрый день! Не программист. Пишу для себя, по работе. Пытаюсь вывести в DBGrid данные из нескольких таблиц. Сложность в том, что аргументом для запроса в таблицах 2, 3, 4, 5 - является значение из таблицы 1. Т.е. вроде такого: Таблица 1 Фамилия Иванов Имя Иван Отчество Иваныч Сила 3 Вредность 2 Красота 1 Ловкость 4 Т.е. В полях "Сила", "Вредность", "Красота", "Ловкость", не значения, а индексы, ID значения других таблиц. Ну типа такого: 1 - низкая 2 - средняя 3 - высокая. Ну и вот в DBGrid я пытаюсь вывести не индексы, а значения с других таблиц. Чтото типа: Фамимлия Иванов Имя Иван Отчество Иваныч Сила высокая Вредность средняя Красота низкая Ловкость хорошая Читал про JOIN но уверенности не появилось, пробовать пока не пробовал. В таблицах нашел такую вещь как Foreign keys. Вроде настроил, но как пользоваться - не понял)) Так вот нутром чую, что решение простое и распространённое, но какое именно незнаю. Толи SQL запрос, толи сама организация таблиц в СУБД... В общем помогите найти правильный путь. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2020, 17:07 |
|
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
|
|||
---|---|---|---|
#18+
ADR07 В таблицах нашел такую вещь как Foreign keys. Вроде настроил, но как пользоваться - не понял)) В правильном направлении идешь. Пользоваться с помощью упомянутого JOIN Гугль в помощь https://www.google.com/search?q=SQL JOIN ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2020, 17:18 |
|
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
|
|||
---|---|---|---|
#18+
ADR07 В таблицах нашел такую вещь как Foreign keys. Вроде настроил, но как пользоваться - не понял)) А вот внешние ключи ты тут зря использовать начал. Они вообще работать у тебя тут не должны были, но если они у тебя заработали, значит ты точно в SQLite и внешние ключи выключены. (в других СУБД внешние ключи выключить нельзя, а в sqlite их надо явно включать). Проблема в твоем случае в том, что первая таблица должна состоять из двух полей: тип значения и код значения. Но у тебя получается смесь "значиние" и "код значения". ТипКодФамилияИвановИмяИванОтчествоИванычСила3Вредность2Красота1Ловкость4 И если делать правильные внешние ключи, то тебе надо делать словарную таблицу: КодЗначениеИвановИвановИванИванИванычИваныч1низкая2средняя3высокая Технически это можно сделать конечно, если считать код (например 1 для "низкая") не цифрой а текстом "1". Хотя для SQLite это не так критично за счет ее наплевательства на типы данных в колонках. Но с точки зрения трудоемкости - тебе придется делать пары "код-значения" для каждого имени. Теоретически возможно, но практически.... Задачи такого типа решаются транспонированием той части таблицы которая не может быть закодирована (с потерей нормализации), или просто нарезкой на две-три таблицы. Например: ФамилияИмяОтчествоТипКодИвановИванИванычСила3ИвановИванИванычВредность2ИвановИванИванычКрасота1ИвановИванИванычЛовкость4 или просто нарезкой на две-три таблицы. Например: Код_ЧеловекаФамилияИмяОтчествоИИИ1ИвановИванИваныч Код_ЧеловекаТипКодИИИ1Сила3ИИИ1Вредность2ИИИ1Красота1ИИИ1Ловкость4 Вот тут уже можно делать внешние ключи. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2020, 21:56 |
|
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
|
|||
---|---|---|---|
#18+
Спасибо! Но я не уверен, что правильно понял такие слова, как: транспонирование, нарезка, нормализация. Каждый человек у меня имеет уникальный код. Но кодировать каждое ФИО - слишком трудоёмко в рамках моей задачи. Как должны работать внешние ключи я смутно представляю. Делаю так - в "дочерней" таблице создаю ключ, задаю поле ID, потом в том же окошке выбираю "родительскую" таблицу и её поле ID И я себе это представляю так: Обычная SELECT выборка по родительской таблице - автоматически ставит указатель и в дочерних таблицах на это ID. Внешние ключи мне нужны только для того, что бы в один грид, в одном запросе, вывести данные из нескольких таблиц. Но как должен выглядеть запрос - не понимаю. Если разбить на задачи, должно быть примерно так: Есть ключевые поля Таблица 1 ID1, Таблица 2 ID2 и т.д. 1. Запрос по неважно какому критерию, по таблице 1, с определением ID1 конкретной записи; 2. Запрос по таблице 2 с поиском записи, где ID1 = ID2; 3. Запрос по таблице 3 с поиском записи, где ID1 = ID3; Ну и далее по всем дочерним таблицам. Программно, как это сделать я понимаю, "вручную" сформировать Grid думаю смогу. Но что бы натсроить это всё сразу, в дизайнере Delphi - нужен конкретный SQL запрос. Который у меня никак не рождается)) Очевидно решение тут более сложное или даже нет - более профессиональное. White Owl или просто нарезкой на две-три таблицы. Например: Код_ЧеловекаФамилияИмяОтчествоИИИ1ИвановИванИваныч Код_ЧеловекаТипКодИИИ1Сила3ИИИ1Вредность2ИИИ1Красота1ИИИ1Ловкость4 Вот тут уже можно делать внешние ключи. Вот так сделать я могу. В первой таблице ID и уникальный данные, которые кодировать трудоёмко. В остальных таблицах - коды и значения. Как тут должен работать внешний ключ и выглядеть запрос из нескольких таблиц? JOIN? Подскажите пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2020, 10:09 |
|
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
|
|||
---|---|---|---|
#18+
ADR07 Как должны работать внешние ключи я смутно представляю. Делаю так - в "дочерней" таблице создаю ключ, задаю поле ID, потом в том же окошке выбираю "родительскую" таблицу и её поле ID Внешние ключи имеют смысл в ситуации типа: - У тебя данные представлены как я показывал в последнем примере (есть таблица людей с полем КодЧеловека). - В этой таблице есть только одна строка с кодом "ИИИ1" - Теперь пытаемся в ведомой таблице добавить строку ссылающуюся на человека ИИИ2 - вот тут внешний ключ выдаст ошибку, что мол нет такого ИИИ2 в главной таблице, потому новую строку в ведомую добавлять нельзя. ADR07 Но как должен выглядеть запрос - не понимаю. Прочитать учебник - обязательно: https://www.sql.ru/docs/sql/u_sql/ ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2020, 17:37 |
|
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
|
|||
---|---|---|---|
#18+
ADR07, давай уточним исходные данные. Возможно мы друг-друга недопонимаем. ADR07 Таблица 1 Фамилия Иванов Имя Иван Отчество Иваныч Сила 3 Вредность 2 Красота 1 Ловкость 4 Она именно так заполнена или так ФамилияИмяОтчествоСилаВредностьКрасотаЛовкостьИвановИванИваныч3214 или еще как-то? PS Это очень важно как хранятся данные, т.к. если не соблюдать требования к хранению, то не будет способов правильно извлекать нужное. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2020, 17:51 |
|
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
|
|||
---|---|---|---|
#18+
Dima T ADR07, давай уточним исходные данные. Возможно мы друг-друга недопонимаем. ФамилияИмяОтчествоСилаВредностьКрасотаЛовкостьИвановИванИваныч3214 Вот именно так. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2020, 10:55 |
|
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
|
|||
---|---|---|---|
#18+
ADR07 Dima T ADR07, давай уточним исходные данные. Возможно мы друг-друга недопонимаем. ФамилияИмяОтчествоСилаВредностьКрасотаЛовкостьИвановИванИваныч3214 Вот именно так. Ты пробовал читать по ссылке, которую я давал 22223711 ? Первая же статья сразу просто и с примерами все объясняет. Ну допустим тебя в гугле забанили, напишу тоже самое. Пусть та таблица называется Люди , и есть еще одна таблица Силы СилаОписаниеСилы1низкая2средняя3высокая дальше сам запрос Код: sql 1.
дальше теорию читай, нет смысла сюда ее перепечатывать ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2020, 12:58 |
|
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
|
|||
---|---|---|---|
#18+
Понимаешь в чём проблема. Там по первой же ссылке - непонятно. Названия таблиц и полей одно - в запросе другое. По следующим ссылкам - объединяют не более 2х таблиц, а как прикручивать третью, четвёртую, пятую - через запятую, пробел, точку с запятой - не сказано. Но я разобрался - спасибо. Получилось так: Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2020, 14:21 |
|
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
|
|||
---|---|---|---|
#18+
ADR07 Понимаешь в чём проблема. Там по первой же ссылке - непонятно. Названия таблиц и полей одно - в запросе другое. Для таблиц это сокращенное наименование, действует внутри запроса чтобы меньше писать, т.к. имена таблиц достаточно длинные бывают, например тут вместо persons пишем p. Для полей наоборот, можно переименовать название столбца в результате, т.е. p.name в итоге придет в поле под именем `Имя сотрудника` Код: sql 1. 2.
ADR07 По следующим ссылкам - объединяют не более 2х таблиц, а как прикручивать третью, четвёртую, пятую - через запятую, пробел, точку с запятой - не сказано. Но я разобрался - спасибо. Ну так и надо было спросить, тут телепатов нет, ты много где мог накосячить и по разному. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2020, 14:29 |
|
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
|
|||
---|---|---|---|
#18+
Эти сокращённые названия де то надо предопределять? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2020, 14:35 |
|
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
|
|||
---|---|---|---|
#18+
ADR07 Эти сокращённые названия де то надо предопределять? Нет, это действует в границах конкретного запроса, на другие никак не влияет. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2020, 14:37 |
|
|
Start [/forum/topic.php?fid=54&tid=2008348&gotonew=1]: |
0ms |
get settings: |
1ms |
get forum list: |
7ms |
check forum access: |
0ms |
check topic access: |
0ms |
track hit: |
26ms |
get topic data: |
5ms |
get first new msg: |
2ms |
get forum data: |
1ms |
get page messages: |
23ms |
update_topic_read_status (2008348): 03.11.2020 16:27:17: |
0ms |
get tp. blocked users: |
0ms |
get online users: |
54ms |
check new: |
1ms |
others: | 98ms |
total: | 218ms |
0 / 0 |