Вы агрегируете по связанным измерениям и получаете перерасчет.
Один из подходов заключается в использовании нескольких агрегаций:
SELECT u.id, u.username, COUNT(a.id) AS total_articles,
SUM(c.num_comments) AS total_comments
FROM users u LEFT JOIN
articles a
ON a.user_id = a.id LEFT JOIN
(SELECT c.article_id, COUNT(c.id) as num_comments
FROM comments c
GROUP BY c.article_id
) c
ON a.id = c.article_id
GROUP BY u.id, u.username;
erm это действительно работает? Я только что протестировал его?
/****** Object: Table [dbo].[DateTest] Script Date: 09/26/2008 10:44:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[DateTest](
[Date1] [datetime] NULL,
[Date2] [datetime] NOT NULL
) ON [PRIMARY]
GO
Insert into DateTest (Date1,Date2) VALUES (NULL,'1-Jan-2008')
Insert into DateTest (Date1,Date2) VALUES ('1-Jan-2008','1-Jan-2008')
Go
SELECT * FROM DateTest WHERE Date1 is not NULL
GO
SELECT * FROM DateTest WHERE Date2 is not NULL
Только для исключения возможности - это, кажется, не имеет никакого отношения ANSI_NULLS
опция, потому что это управляет по сравнению с ПУСТЫМ УКАЗАТЕЛЕМ с =
и <>
операторы. IS [NOT] NULL
работы, является ли ANSI_NULLS
ON
или OFF
.
я также попробовал это против SQL Server 2005 с isql
, потому что ANSI_NULLS
значения по умолчанию к OFF
при использовании Библиотеки DB.