Pergunta

SQL Server 2005.

Eu estou adicionando restrições de chave estrangeira no banco de dados de um aplicativo que supostamente não precisava deles. Naturalmente, os dados tornou-se incerto e não são órfãs entradas no campo de chave estrangeira.

Configuração:
Duas mesas, TableUser e TableOrder. TableUser tem 'UserID' chave primária, e TableOrder tem chave estrangeira 'UserID'.

Como faço para encontrar as linhas onde TableOrder.UserID tem nenhuma entrada correspondente na TableUser.UserID?

Por exemplo, TableOrder.UserID tem um valor de 250, mas não há nenhuma chave TableUser.UserID correspondente para 250.

Foi útil?

Solução

Aqui está uma maneira:

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

Existem muitas maneiras diferentes de escrever este tipo de consulta.

Outras dicas

A outra abordagem comum é a-junção externa esquerda:

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

Esta consulta também pode ser útil sem a cláusula onde, para percorrer e ver os valores correspondentes (se existirem), e ver quais os que têm nenhuma correspondência.

Não houve restrições FK nas tabelas para começar. A foram utilizados como FK e PK, mas não codificado - a crença era que eles eram uma sobrecarga desnecessária. Portanto, temos todas as colunas, mas as restrições não codificados. Quando fui para colocá-los em para que eles pudessem ser aplicadas, descobri que havia muitas violações.

A sua questão destaca o problema. Eles são sobrecarga não desnecessário, eles impedem as pessoas de asshattery banco de dados geral.

Ambos Greg e respostas de Brad me ajudou.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top