27,579
社区成员
发帖
与我相关
我的任务
分享
USE tempdb
GO
IF OBJECT_ID('view_user') IS NOT NULL DROP VIEW view_user
GO
IF OBJECT_ID('dbo.[user]') IS NOT NULL
DROP TABLE dbo.[user]
GO
CREATE TABLE dbo.[user](
[uid] INT PRIMARY KEY
)
GO
IF OBJECT_ID('dbo.[adver]') IS NOT NULL
DROP TABLE dbo.[adver]
GO
CREATE TABLE dbo.[adver](
[aid] INT PRIMARY KEY
,[uid] INT
)
GO
SET NOCOUNT ON
INSERT INTO dbo.[user] VALUES(N'1001')
INSERT INTO dbo.[user] VALUES(N'1002')
INSERT INTO dbo.[user] VALUES(N'1003')
INSERT INTO dbo.[user] VALUES(N'1004')
INSERT INTO dbo.[user] VALUES(N'1005')
SET NOCOUNT ON
INSERT INTO dbo.[adver] VALUES(N'101',N'1001')
INSERT INTO dbo.[adver] VALUES(N'102',N'1001')
INSERT INTO dbo.[adver] VALUES(N'103',N'1002')
INSERT INTO dbo.[adver] VALUES(N'104',N'1001')
INSERT INTO dbo.[adver] VALUES(N'105',N'1003')
INSERT INTO dbo.[adver] VALUES(N'106',N'1005')
INSERT INTO dbo.[adver] VALUES(N'107',N'1003')
INSERT INTO dbo.[adver] VALUES(N'108',N'1003')
INSERT INTO dbo.[adver] VALUES(N'109',N'1005')
INSERT INTO dbo.[adver] VALUES(N'110',N'1003')
INSERT INTO dbo.[adver] VALUES(N'111',N'1004')
INSERT INTO dbo.[adver] VALUES(N'112',N'1004')
GO
IF OBJECT_ID('view_user') IS NOT NULL DROP VIEW view_user
GO
CREATE VIEW view_user
WITH SCHEMABINDING
AS
SELECT a.[uid],COUNT_BIG(*) AS sumclo
FROM dbo.adver AS a
GROUP BY a.[uid]
GO
CREATE UNIQUE CLUSTERED INDEX ix_view_user ON view_user(uid)
GO
--索引视图的好处是它本身相当于一张表,查询时不需要重新统计,效率高
--如果 user 表 在 adver 中一定有记录(1对1或多,而不是1对0或多),
--可以把 user 表放到索引视图中,就更方便了。
SELECT * FROM dbo.[user] AS a LEFT JOIN view_user AS b ON a.uid=b.uid
CREATE FUNCTION dbo.Get_RowCount (@uid INT)
RETURNS INT
AS
BEGIN
DECLARE @rowcount INT;
SELECT @rowcount = COUNT(1)
FROM adver
WHERE adver.uid = @uid;
RETURN @rowcount;
END;
GO
ALTER table [user]
add sumclo AS dbo.Get_RowCount(uid)
Select * from [user]