computed by не компьютится

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
sydenis
Сообщения: 64
Зарегистрирован: 22 фев 2005, 16:09

computed by не компьютится

Сообщение sydenis » 21 апр 2005, 11:49

добавляю в таблицу поле:
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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 21 апр 2005, 12:48

Сама идея field, computed by запрос из другой таблицы. В принципе допускается, но на некоторых старых версиях может вести аж к нересторабельности бакапа. А даже если не ведёт - это один из самых верных способов угробить быстродействие системы в целом к чёртовой матери. Так что что тут не так на уровне синтаксиса - даже вникать не буду, не приношу вреда вопрошающим из религиозных убеждений.

sydenis
Сообщения: 64
Зарегистрирован: 22 фев 2005, 16:09

Сообщение sydenis » 21 апр 2005, 13:34

ну напрасно так скоро судить...
Такого рода конструкции уже пару лет уменя работают в одной базе на yaffil - к сожалению, она сейчас мне недоступна, поэтому не могу посмотреть.
Кроме того эта схема описана в одной старой, большой и серьёзной книге по интербейзу г-на Скляра. У него это работало ещё на IB6.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 21 апр 2005, 14:00

Никифоров Денис писал(а):ну напрасно так скоро судить...
Ой, я тебя умоляю (С), скоро судить. Про сравнительную эффективность джойнов и вложенных подзапросов (эти самые computed) будем судачить? Скушно. Да, в базе из трёх с половиною таблиц и пяти с четвертью записей, эксплуатируемой двумя юзерами с двумя третями - худо-бедно проходит.
Никифоров Денис писал(а): Такого рода конструкции уже пару лет уменя работают в одной базе на yaffil
Как-то они работали с рождества Джимова. Но это не путь. Тупиковая ветвь эволюции.
Никифоров Денис писал(а): Кроме того эта схема описана в одной старой, большой и серьёзной книге по интербейзу г-на Скляра. У него это работало ещё на IB6.
Собственно, эта старая, большая и серьёзная книга представляет собой всего лишь перевод одного из томов доки, а именно - Embedded SQL Guide, ставшего ныне почти рудиментом. Нравится - дерзайте.

sydenis
Сообщения: 64
Зарегистрирован: 22 фев 2005, 16:09

Сообщение sydenis » 21 апр 2005, 14:10

:))))
т.е. я так понял, что ни книгу Скляра ты даже в руках не держал (слышал как мужики в метро обсуждали), ни Embedded SQL Guide не читал, потому как о computed полях в основном написано не там, а в Data Definition. Поэтому вопрос к тем кто знает.
Поправка - FB 1.5.2, а не .1 может в FB есть своя специфика в реализации таких вещей?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 21 апр 2005, 15:02

Короче. Синтаксис прекрасным образом расписан в общедоступном Language Reference, в использовании имён полей таблицы в computed и check есть разница при create table и alter table и есть нюансы по коммиту предыдущих действий в базе, что в доке не затронуто. Разжёвывать я тебе не буду, во-первых, потому что я отродясь не читал ни книг, ни доки, начиная с Embedded SQL Guide, который в середине 90-х был, пожалуй, действительно самым методологически всеохватывающим томом, и, следственно, никоим образом не отношусь к тем, кто знает, а во-вторых, мне элементарно лень.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 21 апр 2005, 22:12

т.е. я так понял, что ни книгу Скляра ты даже в руках не держал
Книгу Скляра надо немедленно в сортир. Ибо это тупой перевод ProgGuide.pdf, который ныне называется Embedded SQL Guide. И читают ее только те, кто пишет на чистом C с использованием GPRE.

насчет реализации - что это за нафиг запрос
select qty * t.summ from tb_tarifs t where t.id=tarif

звездочка это что? почему не указан алиас у qty?
Доку бы сначала посмотрел, langref.pdf.

p.s. сочувствую, что ты купил Скляра. Выкинутые деньги.

sydenis
Сообщения: 64
Зарегистрирован: 22 фев 2005, 16:09

Сообщение sydenis » 22 апр 2005, 10:10

:)))
дался вам этот Скляр! Я его купил, читал и пользовал в работе года четыре назад и был очен доволен. Если ты, Дим, говоришь - устарело,
OK - не буду спорить.
Насчёт звёздочки - не понял наезда? Это типа я умножаю так :)))
А насчёт алиасов - верно! Только какой алиас должен быть у поля текущей таблицы? Это ж не триггер ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 22 апр 2005, 10:22

Я его купил, читал и пользовал в работе года четыре назад и был очен доволен.
не понимаю, чему там быть довольным.
Column unknown.
TARIF.
так это, а структура таблицы?

sydenis
Сообщения: 64
Зарегистрирован: 22 фев 2005, 16:09

Сообщение sydenis » 22 апр 2005, 11:42

есть (упрощённо) две таблички:

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, но мне интересно почему вдруг перестал работать этот давно проверенный приём

Dnico
Сообщения: 12
Зарегистрирован: 18 фев 2005, 16:44

Сообщение Dnico » 22 апр 2005, 20:40

Сделал у себя - все проходит ... FB 1.5.2

Dnico
Сообщения: 12
Зарегистрирован: 18 фев 2005, 16:44

Сообщение Dnico » 22 апр 2005, 20:47

Прошу прощения ... фигня конечно получилась ...
Написал так:

Код: Выделить всё

((SELECT COUNT(*) FROM REGION R WHERE R.ID = ID))
Он конечно сожрал ID, то и понятно R.ID и ID в данном случае одно и тоже :oops:

sydenis
Сообщения: 64
Зарегистрирован: 22 фев 2005, 16:09

Сообщение sydenis » 25 апр 2005, 11:16

:lol:
нашёл тут таки эту скляровскую книгу, оказывается надо использовать в кач-ве алиаса полное имя таблицы, и тогда вся эта затея будет выглядеть как
COMPUTED BY
((
select tab_items.qty * t.summ
from tab_tarifs t
where t.id=tab_items.tarif
))
вот так работает

а насчёт пожирания ресурсов,
по-моему это от селекта зависит - если он это поле не трогает, то таблица выбирается нормально натуралом без всяких джойнов,
но если всё-таки эта сумма нужна, то какая разница кто джойнит: сам сервер или ты ручками - результат всё равно зависит от пряморукости разработчика

Ответить