如何在一个表中建立两列之间的关系

时间:2013-03-27 20:02:32

标签: tsql

我想在相同表中的两个列(程序代码和测试代码)之间建立一对一的关系。我希望所有具有相同测试代码的测试都具有相同的程序代码。

  1. 我的第一个想法是使用UDF查找相同测试代码对应两个不同程序的情况。我了解到这不起作用,因为t-sql仅在INSERTS之后检查检查约束中的UDF,而不是UPDATES之后 why is t-sql allowing me to violate a check constraint that uses a UDP?

  2. 我的下一个想法是将逻辑从UDF移动到检查约束本身。但是t-sql说在检查约束中不允许子查询。这也意味着我不能使用EXISTS语法(我认为它也使用了子查询)。

    ALTER TABLE [dbo].[mytable] WITH CHECK ADD CONSTRAINT [oneProgramPerTest] CHECK
    ( (select COUNT(*) from mydb.dbo.mytable u1 inner join mydb.dbo.mytable u2 on u1.testcode=u2.testcode and u1.progcode <> u2.progcode )=0 )

  3. 除非有某种方法在没有(1)udf或(2)子查询的情况下强制执行此逻辑,否则我似乎需要创建程序代码的“虚拟”表,然后强制执行一对一的关系来自myTable和虚拟表的测试代码之间。这似乎真的丑陋,所以必须有一个更好的方法。正确?

1 个答案:

答案 0 :(得分:2)

您是否了解了规范化(如果您没有为什么要设计数据库?)。你应该有

的结构
tableA
id (PK)
programcode
other fields

tableB
programcode (PK)
testcode

在两个表之间添加正式的外键,并将程序代码定义为tableb中的PK。 然后获取您想要的数据:

select <Name specific fields, never use select *>
from tableA a
join tableB b on a.programcode = b.programcode