在Sql查询时通常会遇到用Count统计,并且会出现记录为0的情况,处理方法分析如下:(记下以防忘记)
为了方便分析,举例说明:
创建相册表T_ Album和相片表T_Photo,并插入部分测试数据
Sql脚本如下:
USE [master]
GO
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'test')
BEGIN
CREATE DATABASE [test] ON PRIMARY
( NAME = N'sadf', FILENAME = N'D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\sadf.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'sadf_log', FILENAME = N'D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\sadf_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
END
GO
EXEC dbo.sp_dbcmptlevel @dbname=N'test', @new_cmptlevel=90
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [test].[dbo].[sp_fulltext_database] @action = 'disable'
end
GO
ALTER DATABASE [test] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [test] SET ANSI_NULLS OFF
GO
ALTER DATABASE [test] SET ANSI_PADDING OFF
GO
ALTER DATABASE [test] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [test] SET ARITHABORT OFF
GO
ALTER DATABASE [test] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [test] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [test] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [test] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [test] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [test] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [test] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [test] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [test] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [test] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [test] SET ENABLE_BROKER
GO
ALTER DATABASE [test] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [test] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [test] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [test] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [test] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [test] SET READ_WRITE
GO
ALTER DATABASE [test] SET RECOVERY FULL
GO
ALTER DATABASE [test] SET MULTI_USER
GO
ALTER DATABASE [test] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [test] SET DB_CHAINING OFF
USE [test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[T_Album]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[T_Album](
[AlbumID] [int] IDENTITY(1,1) NOT NULL,
[AlbumName] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_T_Album] PRIMARY KEY CLUSTERED
(
[AlbumID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[T_Photo]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[T_Photo](
[PhotoID] [int] IDENTITY(1,1) NOT NULL,
[PhotoName] [nvarchar](50) NOT NULL,
[AlbumID] [int] NOT NULL,
CONSTRAINT [PK_T_Photo] PRIMARY KEY CLUSTERED
(
[PhotoID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
USE [test]
GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_T_Photo_T_Album]') AND parent_object_id = OBJECT_ID(N'[dbo].[T_Photo]'))
ALTER TABLE [dbo].[T_Photo] WITH CHECK ADD CONSTRAINT [FK_T_Photo_T_Album] FOREIGN KEY([AlbumID])
REFERENCES [dbo].[T_Album] ([AlbumID])
ON UPDATE CASCADE
ON DELETE CASCADE
insert into T_Album(AlbumName) values(N'生活写真')
insert into T_Album(AlbumName) values(N'风景写实')
insert into T_Album(AlbumName) values(N'名胜古迹')
GO
insert into T_Photo(PhotoName,AlbumID) values(N'生活写真',1)
insert into T_Photo(PhotoName,AlbumID) values(N'生活写真',1)
insert into T_Photo(PhotoName,AlbumID) values(N'生活写真',1)
insert into T_Photo(PhotoName,AlbumID) values(N'名胜古迹',3)
GO
GO
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'test')
BEGIN
CREATE DATABASE [test] ON PRIMARY
( NAME = N'sadf', FILENAME = N'D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\sadf.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'sadf_log', FILENAME = N'D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\sadf_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
END
GO
EXEC dbo.sp_dbcmptlevel @dbname=N'test', @new_cmptlevel=90
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [test].[dbo].[sp_fulltext_database] @action = 'disable'
end
GO
ALTER DATABASE [test] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [test] SET ANSI_NULLS OFF
GO
ALTER DATABASE [test] SET ANSI_PADDING OFF
GO
ALTER DATABASE [test] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [test] SET ARITHABORT OFF
GO
ALTER DATABASE [test] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [test] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [test] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [test] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [test] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [test] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [test] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [test] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [test] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [test] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [test] SET ENABLE_BROKER
GO
ALTER DATABASE [test] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [test] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [test] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [test] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [test] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [test] SET READ_WRITE
GO
ALTER DATABASE [test] SET RECOVERY FULL
GO
ALTER DATABASE [test] SET MULTI_USER
GO
ALTER DATABASE [test] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [test] SET DB_CHAINING OFF
USE [test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[T_Album]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[T_Album](
[AlbumID] [int] IDENTITY(1,1) NOT NULL,
[AlbumName] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_T_Album] PRIMARY KEY CLUSTERED
(
[AlbumID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[T_Photo]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[T_Photo](
[PhotoID] [int] IDENTITY(1,1) NOT NULL,
[PhotoName] [nvarchar](50) NOT NULL,
[AlbumID] [int] NOT NULL,
CONSTRAINT [PK_T_Photo] PRIMARY KEY CLUSTERED
(
[PhotoID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
USE [test]
GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_T_Photo_T_Album]') AND parent_object_id = OBJECT_ID(N'[dbo].[T_Photo]'))
ALTER TABLE [dbo].[T_Photo] WITH CHECK ADD CONSTRAINT [FK_T_Photo_T_Album] FOREIGN KEY([AlbumID])
REFERENCES [dbo].[T_Album] ([AlbumID])
ON UPDATE CASCADE
ON DELETE CASCADE
insert into T_Album(AlbumName) values(N'生活写真')
insert into T_Album(AlbumName) values(N'风景写实')
insert into T_Album(AlbumName) values(N'名胜古迹')
GO
insert into T_Photo(PhotoName,AlbumID) values(N'生活写真',1)
insert into T_Photo(PhotoName,AlbumID) values(N'生活写真',1)
insert into T_Photo(PhotoName,AlbumID) values(N'生活写真',1)
insert into T_Photo(PhotoName,AlbumID) values(N'名胜古迹',3)
GO
现打算获得各个相册中的相片数
,实现sql脚本如下:
select AlbumName As N'相册',Count(PhotoID) As N'相片数' from T_Album left outer join (select PhotoID,PhotoName,AlbumID from T_Photo) T on T_Album.AlbumID=T.AlbumID Group By AlbumName
主要采用左连接的方法处理。
得到结果如下: