I have a production and development database, and whilst trying to find orphaned rows, i ran into an odd problem.
The table structure is as follows (generated by Entity framework):
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[OrderCustomerData](
[Id] [uniqueidentifier] NOT NULL,
[FirstName] [nvarchar](200) NULL,
[LastName] [nvarchar](200) NULL,
[Email] [nvarchar](200) NULL,
[City] [nvarchar](200) NULL,
[ZipCode] [nvarchar](10) NULL,
[Country] [nvarchar](50) NULL,
[PhoneNumber] [nvarchar](30) NULL,
[Company] [nvarchar](50) NULL,
[HouseNumber] [nvarchar](10) NULL,
[Street] [nvarchar](200) NULL,
CONSTRAINT [PK_OrderCustomerData] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
--------------------------
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Orders](
[Id] [uniqueidentifier] NOT NULL,
[OrderCustomerDataShippingId] [uniqueidentifier] NULL,
[OrderCustomerDataBillingId] [uniqueidentifier] NULL,
CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Orders] WITH CHECK ADD CONSTRAINT [FK_Orders_OrderCustomerData_OrderCustomerDataBillingId] FOREIGN KEY([OrderCustomerDataBillingId])
REFERENCES [dbo].[OrderCustomerData] ([Id])
GO
ALTER TABLE [dbo].[Orders] CHECK CONSTRAINT [FK_Orders_OrderCustomerData_OrderCustomerDataBillingId]
GO
ALTER TABLE [dbo].[Orders] WITH CHECK ADD CONSTRAINT [FK_Orders_OrderCustomerData_OrderCustomerDataShippingId] FOREIGN KEY([OrderCustomerDataShippingId])
REFERENCES [dbo].[OrderCustomerData] ([Id])
GO
ALTER TABLE [dbo].[Orders] CHECK CONSTRAINT [FK_Orders_OrderCustomerData_OrderCustomerDataShippingId]
GO
ALTER TABLE [dbo].[Orders] WITH CHECK ADD CONSTRAINT [FK_Orders_Orders_ReplacementForOrderId] FOREIGN KEY([ReplacementForOrderId])
REFERENCES [dbo].[Orders] ([Id])
GO
I then run the following sql:
SELECT Count([Id]) as [NotIn] FROM [OrderCustomerData]
WHERE
[Id] NOT IN (SELECT [OrderCustomerDataShippingId] FROM [Orders])
AND [Id] NOT IN (SELECT [OrderCustomerDataBillingId] FROM [Orders])
SELECT Count([Id]) as [In] FROM [OrderCustomerData]
WHERE
[Id] IN (SELECT [OrderCustomerDataShippingId] FROM [Orders])
OR [Id] IN (SELECT [OrderCustomerDataBillingId] FROM [Orders])
SELECT Count([Id]) as [Total], COUNT(DISTINCT([Id])) as [TotalDistinct] FROM [OrderCustomerData]
In the production database this returns:
NotIn
20110272
In
979644
Total TotalDistinct
21089916 21089916
Which adds up: 20110272 + 979644 = 21089916
The development database returns the following:
NotIn
0
In
575924
Total
18566110
Which does not add up: 0 + 575924 <> 18566110
Why do the numbers in the dev table not add up?