1 (edited by Nilaus 2015-05-18 06:28:22)

Topic: SQL запрос

Имеется следующая схема базы данных


Цель SQL запросом выводить данные из этих таблиц (реализован поиск по полям таблиц)
Если для поиска NameOb в таблице Objekts  работает такой SQL код:

SELECT Visits.id AS 'id',
Objekts.NameOb
FROM Visits
LEFT OUTER JOIN (Objekts LEFT OUTER JOIN visits_objects ON Objekts.id=visits_objects.id_Objekts) ON Visits.id=visits_objects.id_Visits

то для поиска Data в  таблице Tu и Vid в таблице VidTu написать похожий код  не получается.
Или, в моем случае необходимо использовать UNION?

Post's attachments

Attachment icon index.png 29.43 kb, 329 downloads since 2015-05-18 

Re: SQL запрос

Пожалуйста, перечислите названия полей, по которым вам необходимо искать и какие столбцы нужны в результате.

Dmitry.

3 (edited by Nilaus 2015-05-18 13:52:41)

Re: SQL запрос

Таблица Visits поле Date
Таблица Objekts поле NameOb
Таблица Tu поле Date
Таблица VidTu  поле Vid
Visits и Objekts  имеют отношение многие-ко-многим через таблицу visits_objects (видно на картинке)

В результате должны быть столбцы: Дата визита, Объект, Дата ТУ, Вид ТУ

Вообще что-то я застопорился на выводе из таблиц связанных с главной через 3-4 таблицы, сам алгоритм прописывания связей не пойму.

4 (edited by Nilaus 2015-05-18 20:03:27)

Re: SQL запрос

Вроде бы нашел решение.

SELECT
Visits.id as 'id',
strftime('%d.%m.%Y', Visits.dataPis),
Objekts.NameOb,
strftime('%d.%m.%Y', Tu.DataTu),
VidTu.Vid

FROM
Visits
LEFT OUTER JOIN (Objekts LEFT OUTER JOIN visits_objects ON Objekts.id=visits_objects.id_Objekts) ON Visits.id=visits_objects.id_Visits
LEFT OUTER JOIN Tu  ON  Tu.id_visits_objects=visits_objects.id
LEFT OUTER JOIN VidTu  ON Tu.id_VidTu=Tu.id

WHERE
((Visits.dataPis >= {DateZ1} AND Visits.dataPis <= {DateZ2}) OR ({DateZ2} is null))
AND (case when '{Edit5}'='' then 1=1 else Objekts.NameOb  LIKE '%{Edit5}%' end)
AND ((Tu.DataTu >= {DateTu1} AND Tu.DataTu <= {DateTu2}) OR ({DateTu2} is null))

Upd. Добавил еще в поиск по таблице VidTu, связанной с таблицей ТУ. По значению VidTu ищет прекрасно, но в самой таблице это поле пустое...Что это может быть, просто LEFT OUTER JOIN недостаточно?

Re: SQL запрос

попробуйте так

SELECT
Visits.id as 'id',
strftime('%d.%m.%Y', Visits.dataPis),
Objekts.NameOb,
strftime('%d.%m.%Y', Tu.DataTu),
VidTu.Vid

FROM
Visits

LEFT OUTER JOIN visits_objects ON visits_objects.id_Visits=Visits.id
LEFT OUTER JOIN Objekts ON Objekts.id=visits_objects.id_Objekts
LEFT OUTER JOIN Tu ON Objekts.id=Tu.id_Objekts
LEFT OUTER JOIN VidTu ON VidTu.id=Tu.id_VidTu


WHERE
((Visits.dataPis >= {DateZ1} AND Visits.dataPis <= {DateZ2}) OR ({DateZ2} is null))
AND (case when '{Edit5}'='' then 1=1 else Objekts.NameOb  LIKE '%{Edit5}%' end)
AND ((Tu.DataTu >= {DateTu1} AND Tu.DataTu <= {DateTu2}) OR ({DateTu2} is null))
Dmitry.

6 (edited by Nilaus 2015-05-19 13:57:59)

Re: SQL запрос

Чуть поменял.Вот так работает:

SELECT
Visits.id as 'id',
strftime('%d.%m.%Y', Visits.dataPis),
Objekts.NameOb,
strftime('%d.%m.%Y', Tu.DataTu),
VidTu.Vid

FROM
Visits

LEFT OUTER JOIN visits_objects ON visits_objects.id_Visits=Visits.id
LEFT OUTER JOIN Objekts ON Objekts.id=visits_objects.id_Objekts
LEFT OUTER JOIN Tu  ON  Tu.id_visits_objects=visits_objects.id
LEFT OUTER JOIN VidTu ON VidTu.id=Tu.id_VidTu

WHERE
((Visits.dataPis >= {DateZ1} AND Visits.dataPis <= {DateZ2}) OR ({DateZ2} is null))
AND (case when '{Edit5}'='' then 1=1 else Objekts.NameOb  LIKE '%{Edit5}%' end)
AND ((Tu.DataTu >= {DateTu1} AND Tu.DataTu <= {DateTu2}) OR ({DateTu2} is null))

Иначе смешивает даты выдачи ту. Спасибо за решение, Дмитрий.

7 (edited by yanikmi 2015-09-12 07:30:36)

Re: SQL запрос

А можно немного разжевать SQL запросы, методом от простого к сложному? а то как то сложновато идет:)

Примеры (или если есть свои примеры)
1 - Вариант (просто)
Выбрать одно значение в одном поле из одной таблицы;
2 - Вариант (чуток усложнить)
Выбрать все значения в одном поле из одной таблицы;
3 - Вариант (еще немного)
Выбрать одно значение в нескольких полях из нескольких таблиц
4 - Вариант (уже сложновато)
Вывести полученное значение в разные текстовые поля (Edit, Grid, Label, Memo)
4 - Вариант (Сложно)
Записать в таблицу что нибудь из edit и memo (я знаю что в справки есть это, но может просто до кучи сюда)

Я предполагаю, что эти примеры помогут многим ответить на свои запросы  и не задавать лишних вопросов, хотя могу ошибаться!

Re: SQL запрос

1.

SELECT fieldname FROM tablename WHERE id=5

2.

SELECT fieldname FROM tablename

3.

SELECT
person.lastname, 
person.firstname
groups.groupname

FROM person

LEFT OUTER JOIN groups ON groups.id=person.id_groups

WHERE person.id=5

4.

Form1.Edit1.Text := SQLExecute('SELECT lastname FROM person WHERE id=5');

5.

SQLExecute('INSER INTO person (lastname) VALUES('+Form1.Edit1.sqlValue+')');
Dmitry.