Как реализовать отношение «внешнего соединения» в SQL Server? - PullRequest
0 голосов
/ 27 июля 2011

Это вопрос, который, вероятно, навлечет на себя гнев некоторых типов администраторов баз данных, но я все равно его задам !!

У меня есть база данных SQL Server, и мы добавляем новую таблицу, которая в основномсобирается выступить в качестве справочной таблицы.Мы назовем это tblLookup.Существует еще одна таблица с именем tblMain.

Каждая строка в tblMain будет иметь либо ни одного, либо одну (1009 *) связанную строку (и) в tblLookup.Так что tblLookup содержит «первичный ключ» (хотя на самом деле это не первичный ключ таблицы), а tblMain содержит «внешний ключ».

SQL Server не позволит мне добавить эту связь дажеесли я установлю принудительное ограничение внешнего ключа на нет .

Что мне лучше всего делать?Очевидно, что я могу определить это отношение при SELECT, выполнив LEFT OUTER JOIN - но я бы предпочел, чтобы в самой схеме что-то было (я не уверен, какую выгоду я надеюсь получить?я!)

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

Я думаю, вы спрашиваете, как я могу реализовать ограничение внешнего ключа, где указанные значения не являются уникальными?Другими словами, все ненулевые значения в TableA.ColumnA уже должны присутствовать в TableB.ColumnB, но значения в TableB.ColumnB не являются уникальными.

Если это так, триггер может легко применить это, но выследует принять во внимание ваш дизайн, прежде чем принимать это решение.Почему значения, на которые вы хотите сослаться, не являются уникальными?Возможно, для этого есть подлинная причина, но также возможно, что вы должны извлечь отдельные значения в третью таблицу, а затем получить внешние ключи из обеих ваших других таблиц.Без дополнительной информации о вашей базе данных и о том, что вы моделируете, невозможно сказать, какой здесь лучший подход.

Наконец, и, что стоит, под «справочными таблицами» часто понимают таблицы, которые имеютчетко определенный первичный ключ, на который он ссылается и только на него во внешних ключах, например, странах, валютах, продуктах и ​​т. д. Чтобы избежать путаницы при задании вашего вопроса, вам, вероятно, следует выбрать другие имена таблиц или, что еще лучше, предоставить автономныеПример SQL, который однозначно иллюстрирует вашу проблему.

0 голосов
/ 27 июля 2011

Похоже, вы пытаетесь создать отношение внешнего ключа в неправильном направлении. Вы хотите создать отношения от tblLookup до tblMain. Что-то вроде:

ALTER TABLE tblLookup
    ADD CONSTRAINT FK_tblLookup_tblMain FOREIGN KEY (tblMain_id)
    REFERENCES tblMain (id);
...