Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.78
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
#1

Вычисляемый по другой таблице столбец - SQL Server

23.05.2013, 16:39. Просмотров 5092. Ответов 19
Метки нет (Все метки)

Собственно вопрос: у меня есть в одной таблице идентификатор товара и его количество, в другой таблице - цена за штуку.

Вопрос: как мне в первой таблице сделать поле TotalCount - общая цена? Я пытался сделать так
T-SQL
1
2
3
4
5
6
CREATE TABLE [dbo].[Services](
    [ServiceID] [int] IDENTITY(1,1) NOT NULL,
    [VisitID] [int] NOT NULL,
    [ConsumableID] [int] NOT NULL,
    [Count] [int] NOT NULL,
    [TotalPrice]  AS ([Count]*(SELECT MAX(Price) FROM Consumables WHERE Services.ConsumableID = Consumables.ConsumableID)
но он ругается...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2013, 16:39
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вычисляемый по другой таблице столбец (SQL Server):

Невозможно материализовать вычисляемый столбец "CHECK_STATE" в таблице "ROBJECT", так как он является недетерм
ALTER TABLE ROBJECT ADD CHECK_STATE AS case when CHECK_DATE is null then...

вычисляемый столбец
у меня есть table1 с полями id sum ............. и table2 с...

Вычисляемый столбец
Здравствуйте, ребята! Существует таблица CREATE TABLE .( IDENTITY(1,1)...

Вычисляемый столбец
Всем доброго времени суток. Есть таблица: CREATE TABLE .( IDENTITY(1,1)...

Вычисляемый столбец
Всем доброго времени суток, помогите пожалуйста. Мне необходимо в таблице...

Вычисляемый столбец. Конвертация типов.
Имею таблицу table В ней столбец "id" - int и столбец "data" - data. Хочу...

19
analyst
435 / 142 / 9
Регистрация: 12.01.2009
Сообщений: 678
Записей в блоге: 1
23.05.2013, 16:53 #2
По моему так сделать нельзя. Это через view сделать можно. Но может знатоки исправят)
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
23.05.2013, 17:04  [ТС] #3
TotalPrice, извиняюсь.
0
iap
803 / 613 / 124
Регистрация: 27.11.2009
Сообщений: 1,817
23.05.2013, 17:30 #4
Цитата Сообщение от analyst Посмотреть сообщение
По моему так сделать нельзя. Это через view сделать можно. Но может знатоки исправят)
Можно.
Но сначала надо сделать скалярную функцию, которая возвращает максимум по передаваемому id.
В определении вычисляемого поля использовать эту функцию вместо подзапроса.

Но это тормозной путь.
Лучше вычислять в запросе, джойнясь к соответствующей таблице.
Или действительно VIEW
1
pincet
1301 / 888 / 120
Регистрация: 23.07.2010
Сообщений: 4,805
23.05.2013, 17:38 #5
IMHO - вычисляемые поля - от лукавого. Слишком "plastic" (за что люблю English - можно вот так сказать )
Изменится бизнес-логика - нахватаешься.
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
23.05.2013, 17:41  [ТС] #6
И что делать?

Могу привести схему БД и как я себе это представляю

Что такое VIEW хз. Подозреваю, что вынос логики в гуи, но не уверен
0
pincet
1301 / 888 / 120
Регистрация: 23.07.2010
Сообщений: 4,805
23.05.2013, 17:54 #7
VIEW - витрина или представление. Погугли, я думаю ты разберешься

Добавлено через 1 минуту
http://serversql.ru/predstavlenija-%E2%80%93-view.html
1
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
23.05.2013, 18:12  [ТС] #8
pincet, ну я примерно так и представлял. Просто для меня view - это ГУИ в контексте MVC
0
analyst
435 / 142 / 9
Регистрация: 12.01.2009
Сообщений: 678
Записей в блоге: 1
23.05.2013, 18:28 #9
Цитата Сообщение от iap Посмотреть сообщение
Можно.
Но сначала надо сделать скалярную функцию, которая возвращает максимум по передаваемому id.
В определении вычисляемого поля использовать эту функцию вместо подзапроса.

Но это тормозной путь.
Я скорее это имел в виду.
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
23.05.2013, 18:29  [ТС] #10
analyst, да на самом деле у меня БД на десяток записей (учебная). Поэтому мне пофиг на тормоза. Мне важнее простота. В первую очередь для понимания. Завтра зачет - так что к завтрашнему дню надо уже все сделать и запросы написать. Самосовершенствоваться можно на летних каникулах будет
0
analyst
435 / 142 / 9
Регистрация: 12.01.2009
Сообщений: 678
Записей в блоге: 1
23.05.2013, 18:32 #11
Успехов!)
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
23.05.2013, 20:28  [ТС] #12
Не могу понять, в чем фишка, создал функцию:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ALTER FUNCTION [dbo].[GetPrice] 
(
    -- Add the parameters for the function here
    @ConsumableID int   
)
RETURNS int
AS
BEGIN
    -- Insert statements for procedure here
    DECLARE @Result int;
    SET @Result = ( SELECT MAX(Price)
                    FROM Consumables
                    WHERE ConsumableID = @ConsumableID)
    -- Return the result of the function
    RETURN @Result
END
пытаюсь вызвать как на картинке: нифига
Вычисляемый по другой таблице столбец
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
23.05.2013, 21:17  [ТС] #13
Даже вот так пишу: послыает:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
USE [Radik]
GO
 
/****** Object:  UserDefinedFunction [dbo].[GetPrice]    Script Date: 23.05.2013 20:40:06 ******/
DROP FUNCTION [dbo].[GetPrice]
GO
 
/****** Object:  UserDefinedFunction [dbo].[GetPrice]    Script Date: 23.05.2013 20:40:06 ******/
SET ANSI_NULLS ON
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date, ,>
-- Description: <Description, ,>
-- =============================================
CREATE FUNCTION [dbo].[GetPrice] 
(
    -- Add the parameters for the function here
    @ConsumableID int   
)
RETURNS int
AS
BEGIN
    -- Insert statements for procedure here
    DECLARE @Result int;
    SET @Result = ( SELECT MAX(Price)
                    FROM Consumables
                    WHERE ConsumableID = @ConsumableID)
    -- Return the result of the function
    RETURN @Result
END
 
GO
 
 
SELECT GetPrice(1)

Добавлено через 9 минут
В общем написал такой триггер, пока хватит:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
USE [Radik]
GO
/****** Object:  Trigger [dbo].[TotalPriceTrigger]    Script Date: 23.05.2013 21:07:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [dbo].[TotalPriceTrigger]  
   ON  [dbo].[Benefits]
   AFTER INSERT, UPDATE
AS 
BEGIN
    UPDATE Benefits
    SET TotalPrice = Quantity * ( SELECT MAX(Price)
                    FROM Consumables
                    WHERE ConsumableID = Consumables.ConsumableID)
END
Добавлено через 8 минут
Только как-то не работает...
0
_katon_
379 / 236 / 18
Регистрация: 03.10.2011
Сообщений: 965
24.05.2013, 16:47 #14
А схему перед названием функции пробовали добавлять?
T-SQL
1
Select dbo.functionName(value)
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
24.05.2013, 17:56  [ТС] #15
_katon_, пробовал, все равно не хочет.

Ладно, пока закрыли тему, всем спасибо за помощь
0
pincet
1301 / 888 / 120
Регистрация: 23.07.2010
Сообщений: 4,805
24.05.2013, 18:22 #16
Так при срабатывании такого триггера обновятся все значения поля TotalPrice в Benefits
В триггере обычно inserted и deleted пользуют

Добавлено через 2 минуты
IMHO - Хранить в таблице все, что может быть вычислено - как-то не очень
0
_katon_
379 / 236 / 18
Регистрация: 03.10.2011
Сообщений: 965
24.05.2013, 18:26 #17
Цитата Сообщение от pincet Посмотреть сообщение
IMHO - Хранить в таблице все, что может быть вычислено - как-то не очень
Как минимум ненормально )))). только в случае возникновения проблем с производительностью.
0
pincet
1301 / 888 / 120
Регистрация: 23.07.2010
Сообщений: 4,805
24.05.2013, 18:31 #18
Цитата Сообщение от _katon_ Посмотреть сообщение
проблем с производительностью.
с триггерами и UDF тоже не все так сладко
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
24.05.2013, 20:32  [ТС] #19
pincet, ну если явно не указывать, то вычисляемые столбцы насколько я знаю не хранятся в базе, а считаются.

Просто общая цена (цена за штуку * кол-во) часто использовалась в запросах, хотелось как-то это дело вынести в отдельное поле/процедуру/функцию, но не вышло
0
_katon_
379 / 236 / 18
Регистрация: 03.10.2011
Сообщений: 965
25.05.2013, 09:29 #20
Выкладывайте тексты ошибок. Думаю ошибка и в функции и в триггере одна и та же.
0
25.05.2013, 09:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2013, 09:29
Привет! Вот еще темы с решениями:

Вычисляемый столбец в Microsoft SQL Server
Здравствуйте.Можно ли в Microsoft SQL Server 2008 создать вычисляемый столбец в...

Не материализует вычисляемый столбец по причине его недетерминированости
Доброго времени суток! Пытаюсь создать следующей таблицу с расчётным...

Запрос: приравнять значение в одной таблице значению в другой таблице
как можно осуществить запрос : приравнять значение одной таблицы значению в...

Первичный ключ заполнен в одной таблице норм, он же в другой таблице внешний NULL
Всем доброго времени суток! Проблема следующая: Использую &quot;SQL server...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru