5

SQL Server 2005.Jak wyszukiwać klucze obce, które nie są zgodne z ich ograniczeniami?

Dodaję ograniczenia klucza obcego do bazy danych aplikacji, która rzekomo ich nie potrzebowała. Oczywiście, dane stały się niewiarygodne i są osierocone wpisy w polu klucza obcego.

Ustawienia:
Dwie tabele, TableUser i TableOrder. TableUser ma klucz podstawowy "UserID", a TableOrder ma klucz obcy "UserID".

Jak znaleźć wiersze, w których TableOrder.UserID nie ma pasującego wpisu w TableUser.UserID?

Na przykład TableOrder.UserID ma wartość 250, ale nie ma klucza do dopasowywania TableUser.UserID 250.

+0

Po znalezieniu ich, co chcesz z nimi zrobić? Np. Je usunąć? – erickson

+0

ERRR, jeśli istnieje klucz obcy, w jaki sposób może on nie pasować? Czy faktycznie masz FK-y zakodowane w twoim SQL? –

+0

Oznacza on tabelę z polami, które są traktowane przez aplikację jako klucz obcy, ale nigdy nie były egzekwowane przez samą bazę danych. – BradC

Odpowiedz

8

Oto jeden ze sposobów:

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

Istnieje wiele różnych sposobów, aby napisać tego rodzaju zapytanie.

4

inny powszechny podejścia jest lewej sprzężenia zewnętrznego:

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

Zapytanie takie może być również użyteczny bez gdzie klauzuli przeglądać i zobaczyć odpowiednie wartości (jeśli istnieje) i zobacz, ci nie pasują.

0

W tabelach nie ma żadnych ograniczeń FK. Były używane jak FK i PK, ale nie zakodowane - przekonanie było takie, że były niepotrzebne nad głową. Mamy więc wszystkie kolumny, ale bez kodowanych ograniczeń. Kiedy poszedłem je umieścić, aby były egzekwowane, odkryłem, że było wiele naruszeń.

Twoje pytanie podkreśla problem. Nie są niepotrzebne narzut, uniemożliwiają ludziom generowanie ogólnych baz danych.

Zarówno odpowiedzi Grega, jak i Brada pomogły mi.

+0

Myślę, że to powszechne nieporozumienie. Wiele osób uważa, że ​​powinno się to odbywać w warstwie środkowej dla logiki biznesowej. Ale FK jest podstawową częścią każdej relacyjnej bazy danych. Jeśli baza danych nie może tego zrobić dobrze, są inne problemy ... –