Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

Хитрый запрос в 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.05 c
14-1088146776
Nikolay M.
2004-06-25 10:59
2004.07.11
А из Твери есть кто?


1-1088595153
Wadim
2004-06-30 15:32
2004.07.11
Приближение просмотра картинки в программе


14-1087980688
miwa
2004-06-23 12:51
2004.07.11
Links (FreeBSD-port) поддержывает coocies?


1-1088061880
Alfer
2004-06-24 11:24
2004.07.11
Internal error L470


3-1087143909
mafuka
2004-06-13 20:25
2004.07.11
InterBase