Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Помогите найти ошибку


Автор: BORINSHTEIN 7.5.2008, 16:59
Код

select * from AUTHOR where
AUTHOR.AID in (select AUTHOR.AID from 
AUTHORSHIP where BOOKS.BID =: BOOKS.BID)



пишет Parameter name expected

Автор: BORINSHTEIN 7.5.2008, 17:31
Вообще я правильно пытаюсь в датасете прописать для случая многие ко многим ?

Автор: Fortop 7.5.2008, 18:06
Код

select AUTHOR.AID from AUTHORSHIP

Объясни, каким образом ты надеешься вытащить поле AID находящееся в таблице AUTHOR из таблицы AUTHORSHIP?

Автор: BORINSHTEIN 7.5.2008, 18:19
Не успел отписать. Это я заметил. написал новое, но что-то опять не пашет (((

Код

select * from AUTHOR where
AUTHOR.AID in ( select AUTHORSHIP.AID from 
AUTHORSHIP where AUTHORSHIP.BID = :BOOKS.BID ) ;


Добавлено через 10 минут и 3 секунды
При попытке добавить поля в датасет выдает
Dynamic SQL Error
SQL error code= -104
Token unknown - line 3, column 34

Автор: Fortop 8.5.2008, 00:12
Не понимает вот этой конструкции 
Код

:BOOKS.BID 


Добавлено через 55 секунд
Это, ты бы структуры привел что ли smile
Было бы гадать удобнее smile

Автор: Deniz 8.5.2008, 05:09
BORINSHTEIN, а для чего там ";" в конце запроса?
И еще, лучше заменить конструкцию типа select ... from ... where field in (select ...) на обычный join, практически всегда можно.
Код
select AUTHOR.* 
from AUTHOR
  join AUTHORSHIP on AUTHOR.AID = AUTHORSHIP.AID
where AUTHORSHIP.BID = :BOOKS.BID

Автор: BORINSHTEIN 10.5.2008, 11:39
Fortop, да есть BOOKS и есть AUTHOR. Связь многие ко многим. И есть таблица AUTHORSHIP, в которой поля BID и AID - это ключи из BOOKS и AUTHOR. Вроде бы не все так мудрено, но вот что-то не выходит.

Автор: Fortop 10.5.2008, 11:45
BORINSHTEIN, если у тебя BOOKS это таки таблица, то возможно стоит делать так?

Код

select * from AUTHOR where
AUTHOR.AID in ( select AUTHORSHIP.AID from 
AUTHORSHIP where AUTHORSHIP.BID = BOOKS.BID ) ;


или так

Код

select * from AUTHOR 
JOIN AUTHORSHIP ON AUTHORSHIP.AID = AUTHOR.AID
JOIN BOOKS ON AUTHORSHIP.BID = BOOKS.BID;

Автор: BORINSHTEIN 10.5.2008, 11:49
Ща испытаем =)  smile

Добавлено через 7 минут и 35 секунд
Fortop, спасибо. smile  В наборе данных появились поля всех 3 таблиц. Сейчас буду их подчинять )))  

Автор: BORINSHTEIN 10.5.2008, 12:23
Произошли какие-то косяки ((( 
В способе с JOIN. Только хотел сменить Active датасета на True, как вышла ошибка Column unknown ASNAME (Фамилия автора).
А если использую другой способ то пишет при добавлении полей в датасет Column unknown BOOKS.BID

Автор: Fortop 10.5.2008, 13:10
BORINSHTEIN, 
в первом способе у тебя данные только из таблицы AUTHOR

Во втором (где JOIN), из всех таблиц, но возможно у тебя имеются одинаковые названия столбцов
поэтому лучше вместо * явно указать ИМЯ_ТАБЛИЦЫ.ИМЯ_ПОЛЯ
для всех данных, которые ты хочешь получить.

Добавлено через 2 минуты и 16 секунд
Ах, да. В первом способе действительно не найдет BOOKS.BID - используй лучше тот что с JOIN
а первый нужно переделать с использованием вложеных подзапросов.

Автор: BORINSHTEIN 10.5.2008, 13:20
Нет, ну конечно BID  - это первичный ключ BOOKS, но он так же содержится как внешний ключ в таблице AUTHORSHIP

Автор: Fortop 10.5.2008, 13:28
BORINSHTEIN, абсолютно ничего непонятно smile
проверяй все свои запросы в первую очередь в IBExpert, потом уже используй в компонентах.

Автор: BORINSHTEIN 10.5.2008, 13:28
В наборе данных появились поля. Мне кажется что в наборе данных стоит что-то удалить из этого ? 
AID - Идентификатор из Авторов
ASNAME - Фам (Авторы).
AFNAME - Имя. (Авторы)
ALNAME - Отч (Авторы)
BID - Идентификатор из Книги
AID1 - из таблицы Авторство. (но н так же назывался AID. В наборе данных сдал AID1, видимо из-за повторения)
BID1 - из таблицы Книги ( АНАЛОГИЧНО )
BNAME - Название киги
BYEAR - Год издания
PID - Издатель (Идентификатор. Сменю на лукап)

Автор: Fortop 10.5.2008, 15:01
BORINSHTEIN, как я и говорил, попробуй ограничить вывод, явным указанием полей и из какой базы ты берешь.
ИМЯ_ТАБЛИЦЫ.ИМЯ_ПОЛЯ

Возможно, это поможет.

Автор: BORINSHTEIN 10.5.2008, 15:23
мне еще говорили в универе, что возможно так

Код

SELECT * from AUTHOR where
AUTHOR.AID in ( select AUTHOR.AID from 
AUTHORSHIP where BOOKS.BID =:const )


connst - это какя-то константа, а куда куда и с чем ее есть я так и не понял  smile 

Автор: BORINSHTEIN 10.5.2008, 15:39
И еще странно, выводит не все книги ...

Автор: Fortop 10.5.2008, 15:56
BORINSHTEIN, естественно.

для того чтобы вывело совсем уж все - используй LEFT OUTER JOIN / RIGTH OUTER JOIN

Добавлено через 32 секунды
Цитата(BORINSHTEIN @  10.5.2008,  15:23 Найти цитируемый пост)
connst - это какя-то константа, а куда куда и с чем ее есть я так и не понял  

вместо нее подставишь индекс твоей книги

Автор: BORINSHTEIN 10.5.2008, 18:23
А как в моём случае использовать LEFT OUTER JOIN / RIGTH OUTER JOIN

Автор: Fortop 10.5.2008, 18:46
BORINSHTEIN,
точно так же как и просто JOIN.


Автор: Alessias 26.8.2008, 14:09
если я правильно понял, тебе надо,чтобы выводило что-то вроде "Автор - книга"
тогда запрос может выглядеть как 
Код

select a.afname, a.asname, a.alname, b.bname, b.byear
from authors a, books b, authorship aa
where a.aid=aa.aid and aa.bid=b.bid



еще вопрос - а нужна ли таблица "авторство", не проще ли в каждой книге хранить id автора?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)