2011-02-12 109 views
0

我有三个表:需要帮助写一个触发

订单: orderid, valuedid, valuesdesc

客户: customerid, cutomdesc

组: groupid, groupdesc

valueid - 顾客的ID或组

valuesdesc - 必须填写适合插入的valueid来自CustomersGroups的说明取决于在客户端中选择了哪些(客户或组)用户。

因此,当客户端发送Orders的插入查询时,它包含新订单的orderidvaluedid。而在客户端,我知道用户选择了什么:组或客户。

我需要什么:如果一个新行插入Orders,相应valuesdescvaluedid从插入valuesdesc列客户或组。

我有一个想法,插入新的订单记录valuesdesc其中包含关键假货价值来挑选正确的词典(客户或团体),但如何创建我现在不知道的触发器。

回答

2

首先,我必须说这是一个非常不寻常的设计。当您将记录插入Orders时,可以使用valuesdesc来提示valueid引用的表格。但只要valuesdesc被触发器填满,valueid实质上就失去了意义。也就是说,您没有透露我们您有任何其他方式可以参考Groups来参考Customers。因此,您可以完全删除valueid,并使用valuesdesc传递该表中的'词典'提示和参考。

除此之外,因为valueid可以引用多个表,所以不能对其使用foreign key约束。

不管怎样,在你现在的设计,你可以试试这个:

CREATE TRIGGER Orders_UpdateValuesdesc 
ON Orders 
FOR INSERT 
AS 
UPDATE o 
SET valuesdesc = COALESCE(c.customdesc, g.groupdesc) 
FROM Orders o 
    INNER JOIN inserted ON o.orderid = i.orderid 
    LEFT JOIN Customers c ON i.valuesdesc = 'Customers' 
    AND i.valueid = c.customerid 
    LEFT JOIN Groups g ON i.valuesdesc = 'Groups' 
    AND i.valueid = g.customerid 

'Customers''Groups'意味着作为字典符的字符串。用实际值替换它们。

触发器使用LEFT JOIN加入既CustomersGroups,然后填充Orders.valuesdesc与任一customdescgroupdesc,这取决于哪一个不为空。

+0

谢谢你的例子。 Andriy,因为我已经理解你解释valueid在获得valuedesc后是多余的,因为它失去了参考和关键含义?它推动了我正确的想法。我会尽力。 – johnny 2011-02-12 19:54:04