Форум: "Базы";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
ВнизХитрый запрос в Interbase Найти похожие ветки
← →
negrila (2004-06-14 08:25) [0]У меня есть табличка, в которой поля 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 как название рубрики.
← →
Sandman25 © (2004-06-14 09:27) [1]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)
← →
Соловьев © (2004-06-14 09:44) [2]
> where A.id in (2,4)
where A.id=1
← →
Sandman25 © (2004-06-14 10:26) [3]>where A.id=1
where B.id=1
← →
Соловьев © (2004-06-14 10:36) [4]
> [3] Sandman25 © (14.06.04 10:26)
нет :)
← →
Соловьев © (2004-06-14 10:39) [5]хтя блин, кто же так пишеть :) запутал ты меня запросом :)
> 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
← →
Sandman25 © (2004-06-14 10:50) [6][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:55) [7]
> Соответсвенно, необязательным должен быть B.name.
Почему ? Я так думаю он строит дерево. И надо показывать всех родителей, в не зависимости есть у них или нет детей.
← →
negrila (2004-06-14 12:03) [8]Мне нужно выполнить SELECT для записей и, если у них ID2 ненулевой, найти в этой же таблице строчку, в которой ID равен данному ID2 и вывести его как еще один столбец, то есть Name уже использовать как название рубрики.
← →
Sandman25 © (2004-06-14 12:04) [9][7] Соловьев © (14.06.04 10:55)
Читаем в [0]:
"Когда я работал с локальной базой, я делал lookup поля на копию этой таблицы, то есть по условию Books.ID2 = Books_copy.ID и возвращал Books_copy.Name как название рубрики."
То есть это дерево ограничено 2 уровнями и при отображении автор ветки идет от листьев к родителям, а не наоборот.
← →
Соловьев © (2004-06-14 12:09) [10]
> о есть это дерево ограничено 2 уровнями и при отображении
> автор ветки идет от листьев к родителям, а не наоборот.
тогда, ты прав:)
но ИМХО, это не правильный подход... А если появится 3 уровня? 4? Хотя наверное автору поста виднее...
← →
Sandman25 © (2004-06-14 12:11) [11][10] Соловьев © (14.06.04 12:09)
>А если появится 3 уровня? 4? Хотя наверное автору поста виднее...
И ему же придется переделывать в случае чего :)
← →
negrila (2004-06-14 12:49) [12]Спасибо, такой запрос работает
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 Русская классика Лермонтов Бородино
← →
Соловьев © (2004-06-14 13:02) [13]а подумать?
← →
negrila (2004-06-14 20:33) [14]Подумал. Спасибо. Получилось что через 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-15 10:02) [15]
> где этот :ID2 взять, ведь пользователь не его будет выбирать,
> а Name, с этим ID2 связанный
кто тебе мешает в запрос вывести B.ID2?
← →
Borissv (2004-06-15 17:12) [16]А почему бы просто не создать отделные отношения "Рубрика" и "Книги". А то 1НФ нарушается
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c