powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
13 сообщений из 13, страница 1 из 1
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
    #40013545
ADR07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Не программист. Пишу для себя, по работе.
Пытаюсь вывести в DBGrid данные из нескольких таблиц. Сложность в том, что аргументом для запроса в таблицах 2, 3, 4, 5 - является значение из таблицы 1. Т.е. вроде такого:
Таблица 1
Фамилия Иванов
Имя Иван
Отчество Иваныч
Сила 3
Вредность 2
Красота 1
Ловкость 4

Т.е. В полях "Сила", "Вредность", "Красота", "Ловкость", не значения, а индексы, ID значения других таблиц. Ну типа такого:
1 - низкая
2 - средняя
3 - высокая.

Ну и вот в DBGrid я пытаюсь вывести не индексы, а значения с других таблиц. Чтото типа:
Фамимлия Иванов
Имя Иван
Отчество Иваныч
Сила высокая
Вредность средняя
Красота низкая
Ловкость хорошая

Читал про JOIN но уверенности не появилось, пробовать пока не пробовал. В таблицах нашел такую вещь как Foreign keys. Вроде настроил, но как пользоваться - не понял))
Так вот нутром чую, что решение простое и распространённое, но какое именно незнаю. Толи SQL запрос, толи сама организация таблиц в СУБД... В общем помогите найти правильный путь.
...
Рейтинг: 0 / 0
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
    #40013548
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ADR07
В таблицах нашел такую вещь как Foreign keys. Вроде настроил, но как пользоваться - не понял))

В правильном направлении идешь. Пользоваться с помощью упомянутого JOIN

Гугль в помощь https://www.google.com/search?q=SQL JOIN
...
Рейтинг: 0 / 0
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
    #40013598
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вот тут уже можно делать внешние ключи.
...
Рейтинг: 0 / 0
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
    #40014130
ADR07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
Но я не уверен, что правильно понял такие слова, как: транспонирование, нарезка, нормализация.
Каждый человек у меня имеет уникальный код. Но кодировать каждое ФИО - слишком трудоёмко в рамках моей задачи.
Как должны работать внешние ключи я смутно представляю.
Делаю так - в "дочерней" таблице создаю ключ, задаю поле 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? Подскажите пожалуйста.
...
Рейтинг: 0 / 0
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
    #40014476
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ADR07
Как должны работать внешние ключи я смутно представляю.
Делаю так - в "дочерней" таблице создаю ключ, задаю поле ID, потом в том же окошке выбираю "родительскую" таблицу и её поле ID
На время забудь о внешних ключах. Они нужны для автоматической поддержки целостности данных. Для выборок они совершенно бесполезны (ну разве что как справочник могут пригодится).

Внешние ключи имеют смысл в ситуации типа:
- У тебя данные представлены как я показывал в последнем примере (есть таблица людей с полем КодЧеловека).
- В этой таблице есть только одна строка с кодом "ИИИ1"
- Теперь пытаемся в ведомой таблице добавить строку ссылающуюся на человека ИИИ2 - вот тут внешний ключ выдаст ошибку, что мол нет такого ИИИ2 в главной таблице, потому новую строку в ведомую добавлять нельзя.

ADR07
Но как должен выглядеть запрос - не понимаю.

Прочитать учебник - обязательно:
https://www.sql.ru/docs/sql/u_sql/
...
Рейтинг: 0 / 0
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
    #40014484
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ADR07, давай уточним исходные данные. Возможно мы друг-друга недопонимаем.
ADR07
Таблица 1
Фамилия Иванов
Имя Иван
Отчество Иваныч
Сила 3
Вредность 2
Красота 1
Ловкость 4

Она именно так заполнена или так
ФамилияИмяОтчествоСилаВредностьКрасотаЛовкостьИвановИванИваныч3214
или еще как-то?

PS Это очень важно как хранятся данные, т.к. если не соблюдать требования к хранению, то не будет способов правильно извлекать нужное.
...
Рейтинг: 0 / 0
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
    #40014760
ADR07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
ADR07, давай уточним исходные данные. Возможно мы друг-друга недопонимаем.
ФамилияИмяОтчествоСилаВредностьКрасотаЛовкостьИвановИванИваныч3214


Вот именно так.
...
Рейтинг: 0 / 0
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
    #40014800
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ADR07
Dima T
ADR07, давай уточним исходные данные. Возможно мы друг-друга недопонимаем.
ФамилияИмяОтчествоСилаВредностьКрасотаЛовкостьИвановИванИваныч3214


Вот именно так.
Ты пробовал читать по ссылке, которую я давал 22223711 ?
Первая же статья сразу просто и с примерами все объясняет.

Ну допустим тебя в гугле забанили, напишу тоже самое. Пусть та таблица называется Люди , и есть еще одна таблица Силы
СилаОписаниеСилы1низкая2средняя3высокая

дальше сам запрос
Код: sql
1.
select Люди.*, Силы.ОписаниеСилы from Люди join Силы on Люди.Сила = Силы.Сила



дальше теорию читай, нет смысла сюда ее перепечатывать
...
Рейтинг: 0 / 0
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
    #40014847
ADR07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понимаешь в чём проблема. Там по первой же ссылке - непонятно. Названия таблиц и полей одно - в запросе другое.
По следующим ссылкам - объединяют не более 2х таблиц, а как прикручивать третью, четвёртую, пятую - через запятую, пробел, точку с запятой - не сказано.
Но я разобрался - спасибо. Получилось так:
Код: sql
1.
2.
3.
4.
5.
SELECT * FROM Люди 
 INNER JOIN Сила ON Люди.Сила = Сила.ID 
 INNER JOIN Ловкость ON Люди.Ловкаость = Ловкость.ID
 INNER JOIN  Красота ON Люди.Красота = Красота.ID
 INNER JOIN Вредность ON Люди.Вредность = Вредность.ID
...
Рейтинг: 0 / 0
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
    #40014852
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ADR07
Понимаешь в чём проблема. Там по первой же ссылке - непонятно. Названия таблиц и полей одно - в запросе другое.

Для таблиц это сокращенное наименование, действует внутри запроса чтобы меньше писать, т.к. имена таблиц достаточно длинные бывают, например тут вместо persons пишем p.
Для полей наоборот, можно переименовать название столбца в результате, т.е. p.name в итоге придет в поле под именем `Имя сотрудника`
Код: sql
1.
2.
SELECT p.id, p.name `Имя сотрудника` ...
FROM `persons` p




ADR07
По следующим ссылкам - объединяют не более 2х таблиц, а как прикручивать третью, четвёртую, пятую - через запятую, пробел, точку с запятой - не сказано.
Но я разобрался - спасибо.

Ну так и надо было спросить, тут телепатов нет, ты много где мог накосячить и по разному.
...
Рейтинг: 0 / 0
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
    #40014855
ADR07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эти сокращённые названия де то надо предопределять?
...
Рейтинг: 0 / 0
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
    #40014858
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ADR07
Эти сокращённые названия де то надо предопределять?

Нет, это действует в границах конкретного запроса, на другие никак не влияет.
...
Рейтинг: 0 / 0
SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
    #40014911
ADR07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite Delphi SELECT из нескольких таблиц. Прошу помощи.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (4): Анонимы (2), Yandex Bot 4 мин., CerebroSQL 9 мин.
Пользователи онлайн (10): Анонимы (6), RePredeclared, Bing Bot 2 мин., Yandex Bot 3 мин., CerebroSQL 3 мин.
x
x
Закрыть


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