2013-03-27 64 views
0

兩列之間的關係,我想建立列之間(和程序代碼的測試代碼)在相同表一比一的關係。我希望具有相同測試代碼的所有測試具有相同的程序代碼。如何建立一個表

  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 )

除非有一些方法來執行不具有(1)一個UDF或該邏輯(2)的子查詢然後好像我需要創建的程序代碼的「虛設」表和然後在myTable的測試代碼和虛擬表之間強制執行一對一的關係。這看起來好像是真的是醜陋,所以有一個更好的方法。對?

+1

爲什麼不只是與程序代碼相關聯的測試代碼FK表? – Paparazzi 2013-03-27 20:14:44

回答

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 
+0

這是一個傳統數據庫!這聽起來像我需要兩個表來建立這種關係 – bernie2436 2013-03-27 20:29:01

+0

爲什麼不使用select *?我仍然在學習 – bernie2436 2013-03-27 20:32:38