Làm thế nào tôi có thể nhận được tất cả các bản ghi mồ côi trong một truy vấn duy nhất?


8

Tôi chỉ nhận thấy một vài bảng có bản ghi mồ côi (khóa ngoại) không còn trỏ đến bất kỳ khóa chính nào. Làm thế nào tôi có thể truy vấn các bảng để có được một danh sách tất cả các hàng như vậy? Khi những hồ sơ cha mẹ đã bị xóa hoặc làm thế nào để xử lý này?

Tôi đang sử dụng SQL Server 2008 R2 và chúng tôi đang cố gắng nhập 3 cơ sở dữ liệu tương tự vào một cơ sở dữ liệu sau khi dọn sạch, xin vui lòng tư vấn.

Viết kịch bản một bảng con mẫu (DocumentDistribution) và bảng cha (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] 

Điều đó không cho tôi biết rằng các bảng có mối quan hệ và được xác định rõ ràng các ràng buộc khóa ngoại?

Câu trả lời:


20

Điều này chỉ có thể nếu bạn có mối quan hệ giữa các bảng mà bạn biết nhưng SQL Server thì không.

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

Bây giờ, trong tương lai, hãy xác định rõ mối quan hệ này, sau đó mọi người sẽ không thể xóa các hàng cha trong khi các hàng con vẫn tồn tại. Để xóa các hàng không nên có ngày hôm nay:

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

Tiếp theo, lấy đi quyền của họ để vô hiệu hóa các ràng buộc này để họ ngừng làm điều này sai cách.


Bạn cũng có thể thực hiện hành động ngược lại bằng cách chuyển đổi bảng con và cha. Điều này sẽ xóa tất cả các hàng cha mẹ không được gọi bởi bảng con - cha mẹ mồ côi, nếu bạn muốn.
djule5
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.