1

Тема: порівняння даних з двох таблиць sql server

як зробити порівняння поля Ціна з таблиці Книги і поля Ціна з таблиці Продажі використовуючи тригер?
Якщо ціна з таблиці продажі нижча від ціни з таблиці книги, тоді генерувати помилку.
Ось є початок, але не знаю в умові Where що потрібно писати?

alter trigger PriceCheck 
on [dbo].[SALES (sale)] 
INSTEAD OF INSERT
AS
BEGIN
IF (EXISTS (SELECT [dbo].[SALES (sale)].Price
 FROM [dbo].[SALES (sale)], inserted I,deleted d,[dbo].[BOOKS (book)]
where 
begin print ('ціна нижча основної') end
END

2 Востаннє редагувалося koala (01.07.2020 14:36:31)

Re: порівняння даних з двох таблиць sql server

Ви, мабуть, очікуєте, що місцеві хакери зламають ваш комп'ютер і подивляться, що у вас там в таблицях? Чи що місцеві телепати зможуть прозріти їхній вміст? Бо якщо ви не розраховуєте ані на перше, ані на друге - то показуйте таблиці без підказки. Бажано наводити мінімальний приклад, що можна відтворити в інших. От очевидно, що в цих таблицях є якісь поля на кшталт ID, можливо, зовнішні ключі, але ж ми їх не побачимо, доки ви про них не напишете, так?

3

Re: порівняння даних з двох таблиць sql server

Загалом вам потрібен INNER JOIN по цих ID і ціни з обох таблиць.

4

Re: порівняння даних з двох таблиць sql server

Саме так. Вибачаюсь за не інформативність.
Є поля ID. В таблиці Книги є поля Айді, назва книги, Кількість сторінок, Ціна, Айді теми(яке є зовнішнім ключем до таблиці Теми), Айді автора(яке є зовнішнім ключем до таблиці Автори), Дата публікації, Опис(що є на обкладинці - назва книги, рік видання, видавництво та інша інформація)
Таблиця Продажі є поля: Айді продажу, айді книги(відношення з таблицею Книги), Дата продажу, ціна, Кількість проданих екземплярів однієї книги, Айді магазину (відношення до таблиці Магазини)
Також є Таблиця Магазини:Айді магазину, назва магазину, айді країни(відношення з таблицею Країни, тобто в якій країні знаходиться магазин)
таблиця Країни: Айді країни, назва країни
таблиця Теми: Айді теми, назва теми
таблиця Автори: Айді автора, ім'я, прізвище, айді країни(відношення до таблиці Країни, тобто з якої країни автор)

5

Re: порівняння даних з двох таблиць sql server

SELECT *
FROM Книги INNER JOIN Продажі ON Книги.Айді == Продажі.айді_книги 
WHERE Продажі.ціна < Книги.Ціна

Якось так.

6

Re: порівняння даних з двох таблиць sql server

треба написати тригер і використовувати таблиці інсертед і делетед
і видавати помилку якщо ціна з таблиці продажі нижча від ціни з таблиці книги

7

Re: порівняння даних з двох таблиць sql server

Ну, deleted очевидно не наш випадок. А Inserted - ви ж додаєте в SALES, відповідно, треба замість нього порівнювати з inserted.

8

Re: порівняння даних з двох таблиць sql server

create trigger PriceCheck 
on [dbo].[SALES (sale)] for insert, update, delete
as
begin
declare @price1 money
declare @price2 money
select @price1=[Price] from[dbo].[BOOKS (book)] 
select @price2 =[Price] from [dbo].[SALES (sale)]
if @price1>@price2  raiserror ('цена продажы меньше основной цены',16,2) 
end

якось так має бути. Але ще треба зробити вибірку з таблиць Іnserted, Deleted.

9

Re: порівняння даних з двох таблиць sql server

alter trigger PriceCheck 
on [dbo].[SALES (sale)] for insert, update, delete
as
begin
declare @price1 money
declare @price2 money
select @price1=b.[Price] from [BOOKS (book)] b inner join inserted i on b.ID_BOOK=i.ID_BOOK
select @price2 =s.[Price] from [SALES (sale)] s inner join deleted d on s.ID_BOOK=d.ID_BOOK
if @price1>@price2  
rollback transaction 
raiserror ('цена продажы меньше основной цены',16,2) 
end

синтаксично помилки немає

10

Re: порівняння даних з двох таблиць sql server

Ви розумієте, що знаходиться в таблицях inserted та deleted?

11

Re: порівняння даних з двох таблиць sql server

І у вас текст повідомлення зламався.

Подякували: leofun011

12

Re: порівняння даних з двох таблиць sql server

інсертед - тимчасова таблиця, куди заносяться дані при вставленні в таблицю, делетед - при видаленні. На скільки я розумію інсертед треба використовувати (в даному випадку), якщо наприклад коли в таблиці було би 10000 записів. Якщо зробити вибірку з таблиці Книги, то як занести всі дані в одну змінну?

13

Re: порівняння даних з двох таблиць sql server

Вибачте, будь ласка, почитайте щось про запити SQL. У вас проблема не з тригером, а з базовим синтаксисом і розумінням того, що відбувається.

14

Re: порівняння даних з двох таблиць sql server

я ще перерлутав інсертед і делетед місцями. Книга заноситься в таблицю делетед, коли її купуюють і за таблиці інсертед вона потрапляє у таблицю продажі де додається до кількості проданих книжок.

15

Re: порівняння даних з двох таблиць sql server

Будь ласка, зверніться до документації.

16

Re: порівняння даних з двох таблиць sql server

create trigger PriceCheck
on [dbo].[SALES (sale)]
for insert
as
begin
declare @a money, @b int, @c int

select @a =[Price], @b = [ID_BOOK] from inserted
select @c = (Select [Price] from [dbo].[BOOKS (book)] where [ID_BOOK] = @b)

if(@a < @c)
begin
raiserror('Sale price`s fewer than the average price', 20, 20)
rollback transaction
end
end

17

Re: порівняння даних з двох таблиць sql server

як цей тригер підігнати під синтаксис оракла?

sasha87 написав:
create trigger PriceCheck
on [dbo].[SALES (sale)]
for insert
as
begin
declare @a money, @b int, @c int

select @a =[Price], @b = [ID_BOOK] from inserted
select @c = (Select [Price] from [dbo].[BOOKS (book)] where [ID_BOOK] = @b)

if(@a < @c)
begin
raiserror('Sale price`s fewer than the average price', 20, 20)
rollback transaction
end
end

18

Re: порівняння даних з двох таблиць sql server

тригер компілюється, але не виконується

create or replace trigger PriceChek
after insert on SALES for each row
declare price books.price%type;
begin
select PRICE into price from books where price=:PRICE and ID_BOOK=ID_BOOK;
    if (:new.Price <price) then
    raise_application_error(-20111,'price is to low');
end if;
end;

19

Re: порівняння даних з двох таблиць sql server

create or replace trigger PriceChek
after insert or update on SALES for each row
declare price books.price%type;
begin
select PRICE into price from books where ID_BOOK =:new.ID_BOOK;
    if (:new.Price <price) then
    raise_application_error(-20111,'price is to low');
end if;
end;

тепер працює