COUNT returns wrong amount of rows for database

Viewed 50

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?

0 Answers
Related