Как мне запросить внешние ключи, которые не соответствуют их ограничениям? - PullRequest
5 голосов
/ 03 ноября 2008

SQL Server 2005.

Я добавляю ограничения внешнего ключа в базу данных приложения, которое якобы им не нужно. Естественно, данные стали ненадежными, и в поле внешнего ключа есть потерянные записи.

Настройка:
Две таблицы, TableUser и TableOrder. TableUser имеет первичный ключ UserID, а TableOrder имеет внешний ключ UserID.

Как найти строки, в которых TableOrder.UserID не имеет соответствующей записи в TableUser.UserID?

Например, TableOrder.UserID имеет значение 250, но нет соответствующего ключа TableUser.UserID для 250.

Ответы [ 3 ]

8 голосов
/ 03 ноября 2008

Вот один из способов:

select * from TableOrder where UserID not in (select UserID from TableUser);

Существует множество способов написания запросов такого типа.

4 голосов
/ 03 ноября 2008

Другим распространенным подходом является лево-внешнее соединение:

SELECT * FROM TableOrder o
LEFT OUTER JOIN TableUser u ON o.UserID = u.UserID
WHERE u.UserID is NULL

Этот запрос также может быть полезен без предложения where, чтобы просмотреть и увидеть соответствующие значения (если они существуют) и посмотреть, какие из них не соответствуют.

0 голосов
/ 04 ноября 2008

Для начала в таблицах не было ограничений FK. Они использовались как FK и PK, но не были закодированы - считалось, что они были ненужными накладными расходами. Таким образом, у нас есть все столбцы, но нет кодированных ограничений. Когда я пошел, чтобы положить их в исполнение, я обнаружил, что было много нарушений.

Ваш вопрос выдвигает на первый план проблему. Они не являются ненужными накладными расходами, они предотвращают людей от общей базы данных.

Ответы Грега и Брэда помогли мне.

...