Eu quero consultar nosso CRM Db
. Eu tenho um backup CRM Db
e o existente. Há um custom entity
,em ambos eu criei. Alguns dos meus registros de entidade personalizados foram excluídos do banco de dados existente. Quero comparar quais registros foram excluídos. O número de registros existentes é 17 e o backup contém 19 registros. A entidade personalizada é denominada new_services
. O banco de dados de backup é nomeado test2
e o existente é MSCRM
O nome da tabela é new_services
e Quando eu consulto isso são iguais:
select * from test2.dbo.new_services as t1,
MSCRM.dbo.new_services as t2
where t1.new_service_Id = t2.new_service_Id;
E retorne registros corretos, mas quando tento isso:
select * from test2.dbo.new_services as t1,
MSCRM.dbo.new_services as t2
where t1.new_service_Id != t2.new_service_Id;
Ele retorna 308 records
! O new_service_id é o guid do registro. Onde está errado?
Sua lógica está errada ;-) Suponha duas tabelas:
Seu primeiro exemplo retornará 1 linha:
enquanto seu segundo exemplo retornará 4*4 - 1 = 15 linhas. Se você pensar sobre isso, em um conjunto de 4x4=16 linhas em que o predicado é verdadeiro por 1 linha, para quantas linhas o predicado é falso?
O que você provavelmente está procurando é MINUS ou EXCEPT (não tenho certeza do que é chamado no sql-server):
ou possivelmente o contrário (não tenho certeza de qual tabela é qual)
Edit: Como apontado nos comentários, o MySQL (não tenho certeza da versão mais recente), não suporta as operações básicas de conjunto INTERSECT e EXCEPT. EXCEPT é SET MINUS e pode ser implementado usando NOT EXISTS ou NOT IN:
Outra opção é usar um OUTER JOIN.
Vale a pena notar que o acima corresponde a
EXCEPT ALL
uma vez que quaisquer duplicatas em T1 são preservadas. Para um operador verdadeiroEXCEPT
, DISTINCT deve ser usado:Não vou me aprofundar nas sombras de null e nas consequências que isso tem para a igualdade lógica entre expressões
INTERSECT, por outro lado, corresponde de perto à multiplicação. Podemos imitar isso com o predicado IN ou EXISTS da mesma maneira que acima.