sql *

Статус: Offline
Реєстрація: 28.07.2010
Повідом.: 31
Кто знает sql подскажите пожалуйста. Перед мною стоит такое задание

Некие поставщики снабжают товарами клиентов. Асортимент товаров велик. Спроектируйте приложение для сопровождения баз данных, которая бы позволяла анализировать следующее:
– какие товары заказывал клиент X у поставщика Y;
– какова стоимость заказа клиента X


Пишу для Oracle 10g код такой
Create table "Client" (
"id_client" Integer NOT NULL ,
"id_supler" Integer NOT NULL ,
primary key ("id_client")
)
/

Create table "supplier" (
"id_supler" Integer NOT NULL ,
"product" Varchar2(20),
"price" Integer,
primary key ("id_supler")
)
/
Alter table "Client" add foreign key ("id_supler") references "supplier" ("id_supler")
Create Trigger "tu_Client"
after update of "id_client","id_supler" on "Client"
referencing new as new_upd old as old_upd
for each row
declare numrows integer;
begin

-- Restrict parent "supplier" when child "Client" updated
if :new_upd."id_supler" != :old_upd."id_supler" then
begin
select count(*) into numrows
from "supplier"
where :new_upd."id_supler" = "supplier"."id_supler";
if (numrows = 0) then
RAISE_APPLICATION_ERROR(-20002,'Parent does not exist in parent table supplier. Cannot update child table Client.');
end if;
end;
end if;

end;
/


-- Insert trigger for "Client"
Create Trigger "ti_Client"
after insert on "Client"
referencing new as new_ins
for each row
declare numrows integer;
begin
-- Restrict child "Client" when parent "supplier" insert
if (:new_ins."id_supler" is not null) then
begin
select count(*) into numrows
from "supplier"
where :new_ins."id_supler" = "supplier"."id_supler";
if (numrows = 0) then
RAISE_APPLICATION_ERROR(-20004,'Parent does not exist in parent table supplier. Cannot insert into child table Client.');
end if;
end;
end if;

end;
/

А как сделать стоимость заказа клиента???
 
В условии уже предполагается, что каждый поставщик может предлагать несколько видов товаров. Кроме того, в нормальном мире клиент может делать заказы более чем у одного поставщика. Твоя схема БД не удовлетворяет ни тому, ни другому.
С триггерами вообще какой-то феерический бред получается.
Минимальная структура БД примерно такая:

attachment.gif


Один и тот же контрагент может быть и покупателем и поставщиком для другого покупателя. Отношение товар - поставщик - цена - заказ упрощенное, но для студента должно прокатить.
В таблице Order, поле TotalPrice - вычисляемое.

Про триггеры забудь. Запомни только что это такое, чтобы можно было ответить, если преподаватель спросит.
 

Вкладення

  • Untitled.gif
    Untitled.gif
    14.1 КБ · Перегляди: 249
а нафига тебе триггеры?:confused:
 
А можно ли вставить это в столбец TotalPrice для автоматического счёта???
update [Order]
set TotalPrice =
(
select sum(Price) as O_sum

FROM Article
group by Article.Name
)

Но так не работает(
 
Останнє редагування:
А можно ли вставить это в столбец TotalPrice для автоматического счёта???

а за каким хреном вставлять в таблицу значение агрегатной функции, если его можно при выборке получить? :confused:

Изобретаешь ты какую-то хуйню, вместо foreign key, лепишь какие-то велосипеды с костылями вместо колес (триггеры), короче тот еще бред... В нормальной базе триггеры практически не нужны, также как goto в языках высокого уровня.
 
Назад
Зверху Знизу