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

8

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

Я использую SQL Server 2008 R2 и мы пытаемся импортировать 3 аналогичные базы данных в одну после очистки, пожалуйста, сообщите.

Сценарий примерной дочерней таблицы (DocumentDistribution) и родительской таблицы (DocumentSource):

ALTER TABLE [dbo].[DocumentDistribution] WITH NOCHECK ADD CONSTRAINT [fk_documentdistsourceid_documentsourceid] FOREIGN KEY([DocumentDistSourceID]) REFERENCES [dbo].[DocumentSource] ([DocumentSourceID]) 
GO
 ALTER TABLE [dbo].[DocumentDistribution] CHECK CONSTRAINT [fk_documentdistsourceid_documentsourceid] 

Разве это не говорит мне о том, что таблицы находятся в отношениях и явно определяют ограничения внешнего ключа?

Шайма Ахмад
источник

Ответы:

20

Это должно быть возможно только в том случае, если у вас есть отношения между таблицами, о которых вы знаете, а SQL Server нет.

SELECT fk 
  FROM dbo.ChildTable AS c
  WHERE NOT EXISTS
  (
    SELECT pk FROM dbo.ParentTable AS p
    WHERE p.pk = c.fk
  );

Теперь, в будущем, определите это отношение явно, тогда люди не смогут удалить родительские строки, пока дочерние строки все еще существуют. Чтобы удалить строки, которых не должно быть сегодня:

DELETE c
  FROM dbo.ChildTable AS c
  WHERE NOT EXISTS
  (
    SELECT pk FROM dbo.ParentTable AS p
    WHERE p.pk = c.fk
  );

Затем отнимите у них права отключить эти ограничения, чтобы они перестали делать это неправильно.

Аарон Бертран
источник
Вы также можете сделать противоположное действие, переключая дочерние и родительские таблицы. Это удалит все родительские строки, на которые не ссылается дочерняя таблица - сироты, если хотите.
djule5