Как я могу запросить внешние ключи, которые не соответствуют их ограничениям?


SQL Server 2005.

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

Настройка:
Два стола, TableUser и TableOrder. TableUser имеет идентификатор первичного ключа', и TableOrder имеет идентификатор внешнего ключа''.

Как мне найти строки, где TableOrder.UserID не имеет соответствующей записи в TableUser.Id_пользователя?

Для например, порядок таблиц.UserID имеет значение 250, но соответствующий TableUser отсутствует.Идентификатор ключа за 250.

3 5

3 ответа:

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

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

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

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

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

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

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

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

Как Грега и Брэда ответы помогли мне выбраться.