No AdventureWorks2016 quando executo a seguinte consulta:
USE AdventureWorks2016
BEGIN TRAN;
SELECT
Sales.SalesOrderHeader.SalesOrderID
FROM
Sales.SalesOrderHeader
JOIN
Sales.Customer
ON Sales.SalesOrderHeader.CustomerID = Sales.Customer.CustomerID
OPTION (RECOMPILE, QUERYTRACEON 8605, QUERYTRACEON 8606, QUERYTRACEON 8607, QUERYTRACEON 3604);
COMMIT TRAN;
GO
Recebo uma varredura não agrupada no CustomerID ( o plano ), portanto, eliminação da chave estrangeira. Funcionou também com o esquema de compras ( o plano ), mas nesta consulta ( o plano ):
BEGIN TRAN
SELECT P.ProductModelID
FROM Production.Product P
JOIN Production.ProductModel PM
ON P.ProductModelID = PM.ProductModelID
OPTION (RECOMPILE, QUERYTRACEON 8605, QUERYTRACEON 8606, QUERYTRACEON 8607, QUERYTRACEON 3604);
COMMIT TRAN
Ou ( o plano ):
BEGIN TRAN
SELECT P.ProductID
FROM Production.Product P
JOIN Production.ProductModel PM
ON P.ProductModelID = PM.ProductModelID
OPTION (RECOMPILE, QUERYTRACEON 8605, QUERYTRACEON 8606, QUERYTRACEON 8607, QUERYTRACEON 3604);
COMMIT TRAN
Recebo varreduras com junções no meu editor de diagramas no SSMS 21:
(name)
FK_Product_ProductModel_ProductModelID
description
Foreign key constraint referencing ProductModel.ProductModelID.
Eu o reativei antes de postar a pergunta, ainda tinha o mesmo plano. A chave estrangeira é
- Confiável
- Não desabilitado
- Não permite nulos
- Não é um esquema diferente
A questão é: por que não estou eliminando a chave estrangeira?
ProductModelID é anulável na tabela Product .
Quaisquer linhas em Product com um ProductModelID nulo seriam eliminadas pela junção com ProductModel . Portanto, a junção tem que ser realizada.
A seguinte modificação rejeita os nulos e permite a eliminação:
db<>demonstração de violino