Vah*_*ian 6 join sql-server default-value cast
在 SQL Server 中工作,假设我有一个包含两个表的数据库:events
和competitors
.
events
有以下列:
[event_id] [event_name] [winner_id] [loser_id]
Run Code Online (Sandbox Code Playgroud)
competitors
有以下列:
[comp_id] [comp_name]
Run Code Online (Sandbox Code Playgroud)
我想添加一个默认约束以[event_name]
在插入新事件时节省我的时间。类似于:
ALTER TABLE [events]
ADD CONSTRAINT DF_event_name
DEFAULT CAST([winner_id] AS varchar(10)) + ' vs ' + CAST([loser_id] AS varchar(10)) FOR [event_name]
Run Code Online (Sandbox Code Playgroud)
当然,这是一个简化版本,它还需要使用competitors ON comp_id = winner_id and comp_id = loser_id
.
当我尝试设置上述默认约束时,我得到了您可能期望的响应:
在此上下文中不允许使用名称“winner_id”。有效的表达式是常量、常量表达式和(在某些上下文中)变量。不允许使用列名。
那么有什么办法可以解决我想要做的事情吗?
有没有办法自动将单元格的值设置为实现从同一行插入的数据的字符串?如果可能的话,是否也可以使用 join 语句来完成?我的下一个想法是触发器。
是的,有几种方法可以做到这一点。
在简化版本中,如果您只需要事件表中的 id,则可以使用computed column
.
像这样的东西:
CREATE TABLE events (
event_id INT,
winer_id INT,
loser_id INT,
event_name AS CAST(winer_id AS VARCHAR(16)) + ' vs ' + CAST(loser_id AS VARCHAR(16))
)
Run Code Online (Sandbox Code Playgroud)
但是,如果您必须从其他表插入名称,则可以使用INSTEAD OF INSERT
和INSTEAD OF UPDATE
触发器。
下面的例子:
CREATE TRIGGER events1_insteadOfInsert ON events2
INSTEAD OF INSERT
AS
INSERT INTO events
SELECT event_id,winer_id,loser_id,c_win.comp_name+ ' vs ' + c_loss.comp_name
FROM inserted i
JOIN competitors c_win ON i.winer_id=c_win.comp_id
JOIN competitors c_loss ON i.winer_id=c_loss.comp_id
Run Code Online (Sandbox Code Playgroud)
最后一个选项可以创建一个视图来根据需要显示结果。在这种情况下,您不需要event_name
表定义中的列。
视图示例:
CREATE VIEW vw_events
AS
SELECT event_id,winer_id,loser_id,c_win.comp_name+ ' vs ' + c_loss.comp_name AS event_name
FROM events e
JOIN competitors c_win ON e.winer_id=c_win.comp_id
JOIN competitors c_loss ON e.winer_id=c_loss.comp_id
Run Code Online (Sandbox Code Playgroud)
在这种情况下,视图看起来是最好的选择。
归档时间: |
|
查看次数: |
1084 次 |
最近记录: |