Страница 1 из 1
computed by не компьютится
Добавлено: 21 апр 2005, 11:49
sydenis
добавляю в таблицу поле:
ADD SUM_R COMPUTED BY
(( select qty * t.summ from tb_tarifs t where t.id=tarif ))
в исходной таблице поля qty и tarif присутствуют, с типами всё - ok.
Однако получаю -
Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
TARIF.
At line 2, column 74.
Чего здесь не так?
FB 1.5.1 + IBExpert
Добавлено: 21 апр 2005, 12:48
Merlin
Сама идея field, computed by запрос из другой таблицы. В принципе допускается, но на некоторых старых версиях может вести аж к нересторабельности бакапа. А даже если не ведёт - это один из самых верных способов угробить быстродействие системы в целом к чёртовой матери. Так что что тут не так на уровне синтаксиса - даже вникать не буду, не приношу вреда вопрошающим из религиозных убеждений.
Добавлено: 21 апр 2005, 13:34
sydenis
ну напрасно так скоро судить...
Такого рода конструкции уже пару лет уменя работают в одной базе на yaffil - к сожалению, она сейчас мне недоступна, поэтому не могу посмотреть.
Кроме того эта схема описана в одной старой, большой и серьёзной книге по интербейзу г-на Скляра. У него это работало ещё на IB6.
Добавлено: 21 апр 2005, 14:00
Merlin
Никифоров Денис писал(а):ну напрасно так скоро судить...
Ой, я тебя умоляю (С), скоро судить. Про сравнительную эффективность джойнов и вложенных подзапросов (эти самые computed) будем судачить? Скушно. Да, в базе из трёх с половиною таблиц и пяти с четвертью записей, эксплуатируемой двумя юзерами с двумя третями - худо-бедно проходит.
Никифоров Денис писал(а):
Такого рода конструкции уже пару лет уменя работают в одной базе на yaffil
Как-то они работали с рождества Джимова. Но это не путь. Тупиковая ветвь эволюции.
Никифоров Денис писал(а):
Кроме того эта схема описана в одной старой, большой и серьёзной книге по интербейзу г-на Скляра. У него это работало ещё на IB6.
Собственно, эта старая, большая и серьёзная книга представляет собой всего лишь перевод одного из томов доки, а именно - Embedded SQL Guide, ставшего ныне почти рудиментом. Нравится - дерзайте.
Добавлено: 21 апр 2005, 14:10
sydenis
)))
т.е. я так понял, что ни книгу Скляра ты даже в руках не держал (слышал как мужики в метро обсуждали), ни Embedded SQL Guide не читал, потому как о computed полях в основном написано не там, а в Data Definition. Поэтому вопрос к тем кто знает.
Поправка - FB 1.5.2, а не .1 может в FB есть своя специфика в реализации таких вещей?
Добавлено: 21 апр 2005, 15:02
Merlin
Короче. Синтаксис прекрасным образом расписан в общедоступном Language Reference, в использовании имён полей таблицы в computed и check есть разница при create table и alter table и есть нюансы по коммиту предыдущих действий в базе, что в доке не затронуто. Разжёвывать я тебе не буду, во-первых, потому что я отродясь не читал ни книг, ни доки, начиная с Embedded SQL Guide, который в середине 90-х был, пожалуй, действительно самым методологически всеохватывающим томом, и, следственно, никоим образом не отношусь к тем, кто знает, а во-вторых, мне элементарно лень.
Добавлено: 21 апр 2005, 22:12
kdv
т.е. я так понял, что ни книгу Скляра ты даже в руках не держал
Книгу Скляра надо немедленно в сортир. Ибо это тупой перевод ProgGuide.pdf, который ныне называется Embedded SQL Guide. И читают ее только те, кто пишет на чистом C с использованием GPRE.
насчет реализации - что это за нафиг запрос
select qty * t.summ from tb_tarifs t where t.id=tarif
звездочка это что? почему не указан алиас у qty?
Доку бы сначала посмотрел, langref.pdf.
p.s. сочувствую, что ты купил Скляра. Выкинутые деньги.
Добавлено: 22 апр 2005, 10:10
sydenis
))
дался вам этот Скляр! Я его купил, читал и пользовал в работе года четыре назад и был очен доволен. Если ты, Дим, говоришь - устарело,
OK - не буду спорить.
Насчёт звёздочки - не понял наезда? Это типа я умножаю так
))
А насчёт алиасов - верно! Только какой алиас должен быть у поля текущей таблицы? Это ж не триггер ?
Добавлено: 22 апр 2005, 10:22
kdv
Я его купил, читал и пользовал в работе года четыре назад и был очен доволен.
не понимаю, чему там быть довольным.
Column unknown.
TARIF.
так это, а структура таблицы?
Добавлено: 22 апр 2005, 11:42
sydenis
есть (упрощённо) две таблички:
tab_items:
id integer
name varchar
qty integer (кол-во)
tarif integer <- FK ко второй таблице
tab_tarifs:
id integer
summ numeric
и теперь хочу в первой таблице всегда видеть общую сумму по позиции,
которую и предполагалось вывести через computed поле первой талицы вида
COMPUTED BY
(( select qty * t.summ from tb_tarifs t where t.id=tarif ))
p.s. я понимаю, что есть сто способов реализовать всё это и без computed, но мне интересно почему вдруг перестал работать этот давно проверенный приём
Добавлено: 22 апр 2005, 20:40
Dnico
Сделал у себя - все проходит ... FB 1.5.2
Добавлено: 22 апр 2005, 20:47
Dnico
Прошу прощения ... фигня конечно получилась ...
Написал так:
Код: Выделить всё
((SELECT COUNT(*) FROM REGION R WHERE R.ID = ID))
Он конечно сожрал ID, то и понятно R.ID и ID в данном случае одно и тоже
Добавлено: 25 апр 2005, 11:16
sydenis
нашёл тут таки эту скляровскую книгу, оказывается надо использовать в кач-ве алиаса полное имя таблицы, и тогда вся эта затея будет выглядеть как
COMPUTED BY
((
select tab_items.qty * t.summ
from tab_tarifs t
where t.id=tab_items.tarif
))
вот так работает
а насчёт пожирания ресурсов,
по-моему это от селекта зависит - если он это поле не трогает, то таблица выбирается нормально натуралом без всяких джойнов,
но если всё-таки эта сумма нужна, то какая разница кто джойнит: сам сервер или ты ручками - результат всё равно зависит от пряморукости разработчика