computed by не компьютится
computed by не компьютится
добавляю в таблицу поле:
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
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
Сама идея field, computed by запрос из другой таблицы. В принципе допускается, но на некоторых старых версиях может вести аж к нересторабельности бакапа. А даже если не ведёт - это один из самых верных способов угробить быстродействие системы в целом к чёртовой матери. Так что что тут не так на уровне синтаксиса - даже вникать не буду, не приношу вреда вопрошающим из религиозных убеждений.
ну напрасно так скоро судить...
Такого рода конструкции уже пару лет уменя работают в одной базе на yaffil - к сожалению, она сейчас мне недоступна, поэтому не могу посмотреть.
Кроме того эта схема описана в одной старой, большой и серьёзной книге по интербейзу г-на Скляра. У него это работало ещё на IB6.
Такого рода конструкции уже пару лет уменя работают в одной базе на yaffil - к сожалению, она сейчас мне недоступна, поэтому не могу посмотреть.
Кроме того эта схема описана в одной старой, большой и серьёзной книге по интербейзу г-на Скляра. У него это работало ещё на IB6.
Ой, я тебя умоляю (С), скоро судить. Про сравнительную эффективность джойнов и вложенных подзапросов (эти самые computed) будем судачить? Скушно. Да, в базе из трёх с половиною таблиц и пяти с четвертью записей, эксплуатируемой двумя юзерами с двумя третями - худо-бедно проходит.Никифоров Денис писал(а):ну напрасно так скоро судить...
Как-то они работали с рождества Джимова. Но это не путь. Тупиковая ветвь эволюции.Никифоров Денис писал(а): Такого рода конструкции уже пару лет уменя работают в одной базе на yaffil
Собственно, эта старая, большая и серьёзная книга представляет собой всего лишь перевод одного из томов доки, а именно - Embedded SQL Guide, ставшего ныне почти рудиментом. Нравится - дерзайте.Никифоров Денис писал(а): Кроме того эта схема описана в одной старой, большой и серьёзной книге по интербейзу г-на Скляра. У него это работало ещё на IB6.
)))
т.е. я так понял, что ни книгу Скляра ты даже в руках не держал (слышал как мужики в метро обсуждали), ни Embedded SQL Guide не читал, потому как о computed полях в основном написано не там, а в Data Definition. Поэтому вопрос к тем кто знает.
Поправка - FB 1.5.2, а не .1 может в FB есть своя специфика в реализации таких вещей?
т.е. я так понял, что ни книгу Скляра ты даже в руках не держал (слышал как мужики в метро обсуждали), ни Embedded SQL Guide не читал, потому как о computed полях в основном написано не там, а в Data Definition. Поэтому вопрос к тем кто знает.
Поправка - FB 1.5.2, а не .1 может в FB есть своя специфика в реализации таких вещей?
Короче. Синтаксис прекрасным образом расписан в общедоступном Language Reference, в использовании имён полей таблицы в computed и check есть разница при create table и alter table и есть нюансы по коммиту предыдущих действий в базе, что в доке не затронуто. Разжёвывать я тебе не буду, во-первых, потому что я отродясь не читал ни книг, ни доки, начиная с Embedded SQL Guide, который в середине 90-х был, пожалуй, действительно самым методологически всеохватывающим томом, и, следственно, никоим образом не отношусь к тем, кто знает, а во-вторых, мне элементарно лень.
Книгу Скляра надо немедленно в сортир. Ибо это тупой перевод ProgGuide.pdf, который ныне называется Embedded SQL Guide. И читают ее только те, кто пишет на чистом C с использованием GPRE.т.е. я так понял, что ни книгу Скляра ты даже в руках не держал
насчет реализации - что это за нафиг запрос
select qty * t.summ from tb_tarifs t where t.id=tarif
звездочка это что? почему не указан алиас у qty?
Доку бы сначала посмотрел, langref.pdf.
p.s. сочувствую, что ты купил Скляра. Выкинутые деньги.
))
дался вам этот Скляр! Я его купил, читал и пользовал в работе года четыре назад и был очен доволен. Если ты, Дим, говоришь - устарело,
OK - не буду спорить.
Насчёт звёздочки - не понял наезда? Это типа я умножаю так ))
А насчёт алиасов - верно! Только какой алиас должен быть у поля текущей таблицы? Это ж не триггер ?
дался вам этот Скляр! Я его купил, читал и пользовал в работе года четыре назад и был очен доволен. Если ты, Дим, говоришь - устарело,
OK - не буду спорить.
Насчёт звёздочки - не понял наезда? Это типа я умножаю так ))
А насчёт алиасов - верно! Только какой алиас должен быть у поля текущей таблицы? Это ж не триггер ?
есть (упрощённо) две таблички:
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, но мне интересно почему вдруг перестал работать этот давно проверенный приём
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, но мне интересно почему вдруг перестал работать этот давно проверенный приём
Прошу прощения ... фигня конечно получилась ...
Написал так:
Он конечно сожрал ID, то и понятно R.ID и ID в данном случае одно и тоже
Написал так:
Код: Выделить всё
((SELECT COUNT(*) FROM REGION R WHERE R.ID = ID))
нашёл тут таки эту скляровскую книгу, оказывается надо использовать в кач-ве алиаса полное имя таблицы, и тогда вся эта затея будет выглядеть как
COMPUTED BY
((
select tab_items.qty * t.summ
from tab_tarifs t
where t.id=tab_items.tarif
))
вот так работает
а насчёт пожирания ресурсов,
по-моему это от селекта зависит - если он это поле не трогает, то таблица выбирается нормально натуралом без всяких джойнов,
но если всё-таки эта сумма нужна, то какая разница кто джойнит: сам сервер или ты ручками - результат всё равно зависит от пряморукости разработчика