2013-03-27 2 views
0

Я хочу, чтобы установить связь один-к-одному между два столбцов (программный код и тестовый код) в же таблице. Я хочу, чтобы все тесты с одним и тем же тестовым кодом имели одинаковый программный код.как установить связь между двумя колоннами в одной таблице

  1. Моя первая мысль заключалась в использовании UDF для поиска случаев, когда один и тот же тестовый код соответствует двум различным программам. Я узнал, что это не будет работать, потому что T-SQL проверяет только UDF, в проверочных ограничений после INSERTS - не после того, как 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) в ОДС или (2) подзапрос, то кажется, что мне нужно, чтобы создать «фиктивный» таблицу кодов программ и затем применяйте взаимно однозначное соотношение между тестовыми кодами от myTable и таблицы фиктивных данных. Кажется, действительно уродливый, так что должен быть лучший способ. Правильно?

+1

Почему не просто стол FK, который связывает тестовый код с программным кодом? – Paparazzi

ответ

2

Вы читали о нормализации (и если у вас нет, почему вы проектируете базу данных?). Вы должны Хейвея структуру с

tableA 
id (PK) 
programcode 
other fields 

tableB 
programcode (PK) 
testcode 

Добавить формальный внешний ключ между двумя таблицами и определить программный код, как ПК в TableB. Затем, чтобы получить данные, которые вы хотите:

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

это устаревший db! мне кажется, что мне нужны две таблицы, чтобы установить это отношение. – bernie2436

+0

почему бы не использовать select *? Я очень много учился – bernie2436

Смежные вопросы