Robię pewne prace konserwacyjne w aplikacji bazy danych i odkryłem, że radość z radości, mimo że wartości z jednej tabeli są używane w stylu kluczy obcych, nie ma ograniczeń dotyczących kluczy obcych w tabelach.
Próbuję dodać ograniczenia FK dla tych kolumn, ale stwierdzam, że ponieważ w tabelach jest już mnóstwo złych danych z poprzednich błędów, które zostały naiwnie poprawione, muszę znaleźć wiersze, które nie dopasuj do drugiej tabeli, a następnie usuń je.
Znalazłem kilka przykładów tego rodzaju zapytań w Internecie, ale wszystkie wydają się dostarczać przykładów, a nie wyjaśnień, i nie rozumiem, dlaczego działają.
Czy ktoś może mi wyjaśnić, jak skonstruować kwerendę, która zwraca wszystkie wiersze bez dopasowań w innej tabeli, i co robi, żebym mógł sam zadawać te zapytania, zamiast uruchamiać SO dla każdej tabeli w tym bałaganie, który ma brak ograniczeń FK?
źródło
NULL
identyfikatora jest ważne w schemacie, możesz mieć większe problemy, nie zgadzasz się? :)SELECT t1.ID, t2.ID
i usuniesz GDZIE linia, uzyskasz lepszy pomysł, jak to działa.Użyłbym
EXISTS
wyrażenia, ponieważ jest ono bardziej wydajne, możesz np. Precyzyjniej wybrać wiersze, które chcesz połączyć, w przypadku, gdyLEFT JOIN
musisz wziąć wszystko, co jest w połączonej tabeli. Jego skuteczność jest prawdopodobnie taka sama jak w przypadkuLEFT JOIN
testu zerowego.źródło
EXISTS
jest jego zmienność.WHERE t2.id IS NULL
) Dziękuję.Tabela 1 zawiera kolumnę, do której chcesz dodać ograniczenie klucza obcego, ale wartości w polu
foreign_key_id_column
Nie wszystkie są zgodne z wartościąid
w tabeli 2.id
s z tabeli 1. To będą wiersze, które chcemy usunąć.NOT IN
Klauzula WHERE ogranicza zapytanie do tylko wiersze, w których wartość wforeign_key_id_column
nie ma na liście w tabeli 2id
s.SELECT
Oświadczenie w nawiasie dostaniesz listę wszystkichid
s, które są w tabeli 2.źródło
IN
klauzuli z listą wartości literalnych. Nie dotyczy to użyciaIN
klauzuli z wynikiem zapytania podrzędnego. Ta zaakceptowana odpowiedź na to pytanie faktycznie rozwiązuje problem za pomocą zapytania częściowego. (Duża lista wartości literalnych jest problematyczna, ponieważ tworzy ogromne wyrażenie SQL. Pod-zapytanie działa dobrze, ponieważ nawet jeśli wynikowa lista jest duża, samo wyrażenie SQL jest małe.)Gdzie
T2
jest tabela, do której dodajesz ograniczenie:I usuń wyniki.
źródło
Pozwól nam mieć następujące 2 tabele (wynagrodzenie i pracownik)
Teraz chcę te rekordy z tabeli pracowników, które nie są wynagrodzeniem. Możemy to zrobić na 3 sposoby:
źródło
Z podobnego pytania tutaj MySQL Inner Join Query Aby uzyskać rekordy nieobecne w innej tabeli Mam to do pracy
smalltable
to miejsce, w którym brakuje danych,bigtable
to miejsce, w którym masz wszystkie dane. Zapytanie zawiera listę wszystkich rekordów, które nie istnieją,smalltable
ale istnieją wbigtable
. Możesz zastąpićid
dowolnym innym pasującym kryterium.źródło
Możesz wybrać Widoki, jak pokazano poniżej:
a następnie pracuj nad widokiem do wybierania lub aktualizowania:
co daje wynik, jak pokazano na poniższym obrazku, tj. dla niepasującej kolumny wypełniono null.
źródło
Nie wiem, który jest zoptymalizowany (w porównaniu do @AdaTheDev), ale ten wydaje się być szybszy, gdy go używam (przynajmniej dla mnie)
Jeśli chcesz uzyskać inny określony atrybut, możesz użyć:
źródło
WYBIERZ * Z Pierwszej tabeli MINUS WYBIERZ * Z innego
źródło
Możesz zrobić coś takiego
źródło
Jak wybrać wiersze bez pasujących wpisów w Obie tabeli?
źródło