Domanda

SQL Server 2005.

Sto aggiungendo vincoli di chiave esterna al database di un'applicazione che presumibilmente non ne aveva bisogno. Naturalmente, i dati sono diventati inaffidabili e ci sono voci orfane nel campo chiave esterna.

Configurazione:
Due tabelle, TableUser e TableOrder. TableUser ha la chiave primaria "UserID" e TableOrder ha la chiave esterna "UserID".

Come posso trovare le righe in cui TableOrder.UserID non ha voci corrispondenti in TableUser.UserID?

Ad esempio, TableOrder.UserID ha un valore di 250, ma non esiste una chiave TableUser.UserID corrispondente per 250.

È stato utile?

Soluzione

Ecco un modo:

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

Esistono molti modi diversi per scrivere questo tipo di query.

Altri suggerimenti

L'altro approccio comune è un join esterno-sinistro:

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

Questa query può essere utile anche senza la clausola where, per sfogliare e vedere i valori corrispondenti (se esistenti) e vedere quali non hanno corrispondenza.

Non c'erano vincoli FK nelle tabelle per cominciare. Erano usati come FK e PK ma non codificati - la convinzione era che fossero inutili spese generali. Quindi abbiamo tutte le colonne, ma nessun vincolo codificato. Quando sono andato a metterli in modo che fossero applicati, ho scoperto che c'erano molte violazioni.

La tua domanda evidenzia il problema. Non sono spese generali inutili, impediscono alle persone di distruggere database in generale.

Entrambe le risposte di Greg e Brad mi hanno aiutato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top