Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.032 c
14-1087988676
Gosha222
2004-06-23 15:04
2004.07.11
Переворачивание картинки


1-1087999257
Alexis
2004-06-23 18:00
2004.07.11
Использование GIF в Delphi


4-1085737780
Cronos
2004-05-28 13:49
2004.07.11
Как заблокировать клавишу Windows? Подскажите, пожалуйста.


8-1082823159
Namo
2004-04-24 20:12
2004.07.11
Delphi 8 + Flash


1-1088100685
Heretic
2004-06-24 22:11
2004.07.11
Шпионы (см. изменения в Excel)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский