![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хитрый запрос в Interbase [D7, IB6.x]
negrila © (2004-06-14 08:25:00)У меня есть табличка, в которой поля ID и ID2, ID2 указывает на ID обобщающего элемента, если это поле равно нулю, такого элемента нет.
Например
ID ID2 Name
1 0 Русская классика
2 1 Пушкин
3 0 Омар Хайам
4 1 Лермонтов
5 0 Зарубежная классика
6 5 Диккенс
Как мне все это через IBDataSet запросом получить в виде
Номер Рубрика Имя
2 Русская классика Пушкин
4 Русская классика Лермонтов
Когда я работал с локальной базой, я делал lookup поля на копию этой таблицы, то есть по условию Books.ID2 = Books_copy.ID и возвращал Books_copy.Name как название рубрики.
Borissv (2004-06-15 17:12:00) [1]А почему бы просто не создать отделные отношения "Рубрика" и "Книги". А то 1НФ нарушается
Соловьев (2004-06-15 10:02:00) [2]
> где этот :ID2 взять, ведь пользователь не его будет выбирать,
> а Name, с этим ID2 связанный
кто тебе мешает в запрос вывести B.ID2?
negrila (2004-06-14 20:33:00) [3]Подумал. Спасибо. Получилось что через JOIN надо делать. Работает. А как в InsertSQL вставлять ID, если пользователь из комбобокса выбрал не ID, а B.NAME из этого запроса FROM AUTHORS A LEFT JOIN AUTHORS B ON A.ID2=B.ID. Поиск запускать, чтобы найти совпадение Name и ID? И как рез-т этого поиска в InsertSQL использовать для вставки в таблицу? Там ведь надо будет писать что-то вроде ID2 = :ID2, а где этот :ID2 взять, ведь пользователь не его будет выбирать, а Name, с этим ID2 связанный
Соловьев (2004-06-14 13:02:00) [4]а подумать?
negrila (2004-06-14 12:49:00) [5]Спасибо, такой запрос работает
SELECT A.NAME, B.NAME FROM AUTHORS A LEFT JOIN AUTHORS B ON A.ID2=B.ID; Все отлично. Но в этой таблице еще много ссылок. Куда теперь добавить выборку из другой таблицы. Например BOOKS.NAME FROM BOOKS WHERE AUTHORS.BOOK_ID=BOOKS.ID И также будет COVERS.TYPE WHERE AUTHORS.COVER_ID=COVERS.ID Каков синтаксис? Куда в этот запрос вставить?
Необходимо получить
Номер Рубрика Имя Книга
2 Русская классика Пушкин Руслан и Людмила
4 Русская классика Лермонтов Бородино
Sandman25 (2004-06-14 12:11:00) [6][10] Соловьев © (14.06.04 12:09)
>А если появится 3 уровня? 4? Хотя наверное автору поста виднее...
И ему же придется переделывать в случае чего :)
Соловьев (2004-06-14 12:09:00) [7]
> о есть это дерево ограничено 2 уровнями и при отображении
> автор ветки идет от листьев к родителям, а не наоборот.
тогда, ты прав:)
но ИМХО, это не правильный подход... А если появится 3 уровня? 4? Хотя наверное автору поста виднее...
Sandman25 (2004-06-14 12:04:00) [8][7] Соловьев © (14.06.04 10:55)
Читаем в [0]:
"Когда я работал с локальной базой, я делал lookup поля на копию этой таблицы, то есть по условию Books.ID2 = Books_copy.ID и возвращал Books_copy.Name как название рубрики."
То есть это дерево ограничено 2 уровнями и при отображении автор ветки идет от листьев к родителям, а не наоборот.
negrila (2004-06-14 12:03:00) [9]Мне нужно выполнить SELECT для записей и, если у них ID2 ненулевой, найти в этой же таблице строчку, в которой ID равен данному ID2 и вывести его как еще один столбец, то есть Name уже использовать как название рубрики.
Соловьев (2004-06-14 10:55:00) [10]
> Соответсвенно, необязательным должен быть B.name.
Почему ? Я так думаю он строит дерево. И надо показывать всех родителей, в не зависимости есть у них или нет детей.
Sandman25 (2004-06-14 10:50:00) [11][5] Соловьев © (14.06.04 10:39)
Поле id2, а не id является необязательным. Соответсвенно, необязательным должен быть B.name. Поэтому A left join B, а не наоборот.
select A.id, B.name, A.name
from mytable A left join mytable B on B.id = A.id2
where A.id in (2,4)
Если же заменить последнюю строку на
where A.id2 = 1 или B.id = 1, то left join нам совсем не нужен, потому как связываемся по значению 1, и можно использовать inner join.
Соловьев (2004-06-14 10:39:00) [12]хтя блин, кто же так пишеть :) запутал ты меня запросом :)
> select A.id, B.name, A.name
> from mytable A left join mytable B on B.id = A.id2
> where A.id in (2,4)
я бы так написал
select A.id, B.name, A.name
from mytable B left join mytable A on B.id = A.id2
where B.id=1
Соловьев (2004-06-14 10:36:00) [13]
> [3] Sandman25 © (14.06.04 10:26)
нет :)
Sandman25 (2004-06-14 10:26:00) [14]>where A.id=1
where B.id=1
Соловьев (2004-06-14 09:44:00) [15]
> where A.id in (2,4)
where A.id=1
Sandman25 (2004-06-14 09:27:00) [16]select A.id, B.name, A.name
from mytable A left join mytable B on B.id = A.id2
where A.id in (2,4)