【发布时间】:2012-12-30 20:20:08
【问题描述】:
这是在存储过程中UNION ALL 的正确方法吗?
ALTER PROCEDURE [GetHomePageObjectPageWise]
@PageIndex INT = 1
,@PageSize INT = 10
,@PageCount INT OUTPUT
,@whereStoryID varchar(2000)
,@whereAlbumID varchar(2000)
,@wherePictureID varchar(2000)
AS
BEGIN
SET NOCOUNT ON;
SELECT StoryID
, AlbumID
, StoryTitle
, NULL AS AlbumName
, (SELECT URL FROM AlbumPictures WHERE (AlbumID = dbo.Stories.AlbumID) AND (AlbumCover = 'True')) AS AlbumCover
, Votes
, NULL AS PictureId
, 'stories' AS tableName
, NEWID() AS Sort
INTO #Results1
FROM Stories WHERE StoryID IN (SELECT StringVal FROM funcListToTableInt(@whereStoryID))
SELECT NULL AS StoryID
, AlbumID
, NULL AS StoryTitle
, AlbumName
, (SELECT URL FROM AlbumPictures AS AlbumPictures_3 WHERE (AlbumID = Albums.AlbumID) AND (AlbumCover = 'True')) AS AlbumCover
, Votes
, NULL AS PictureId
, 'albums' AS tableName
, NEWID() AS Sort
INTO #Results2
FROM Albums WHERE AlbumID IN (SELECT StringVal FROM funcListToTableInt(@whereAlbumID))
SELECT NULL AS StoryID
, NULL AS AlbumID
, NULL AS StoryTitle
, NULL AS AlbumName
, URL
, Votes
, PictureID
, 'pictures' AS tableName
, NEWID() AS Sort
INTO #Results3
FROM AlbumPictures AS AlbumPictures_1
WHERE PictureID IN (SELECT StringVal FROM funcListToTableInt(@wherePictureID))
SELECT * INTO #Results4 FROM #Results1
UNION ALL
SELECT * FROM #Results2
UNION ALL
SELECT * FROM #Results3
SELECT ROW_NUMBER() OVER
(
ORDER BY [Sort] DESC
)AS RowNumber
, * INTO #Results
FROM #Results4
DECLARE @RecordCount INT
SELECT @RecordCount = COUNT(*) FROM #Results
SET @PageCount = CEILING(CAST(@RecordCount AS DECIMAL(10, 2)) / CAST(@PageSize AS DECIMAL(10, 2)))
SELECT * FROM #Results
WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1
DROP TABLE #Results
DROP TABLE #Results1
DROP TABLE #Results2
DROP TABLE #Results3
DROP TABLE #Results4
END
【问题讨论】:
-
你能详细说明你的问题是什么吗?
-
@GordonLinoff 如给定示例所示,第一次我正在做 3
selects并将结果放入 3views然后我在 3views上做union all。所以我想知道,这是正确的方法还是我可以以更好的方式对其进行优化? -
您不是将结果放在三个视图中,而是将它们放在三个临时表中。然后,您将其复制到第四个临时表,并将 that 复制到第五个临时表。这似乎必须有一个更简单的方法。而且您每次都在复制所有记录,即使您只需要结果集中的 10 行(可调整)。但是,实际上很难看到您到底在寻找什么(
NEWID()用于列Sort?),以便能够改进您的程序。你能展示你的表格、样本数据、样本输入参数和所需的输出吗? -
@hvd 请检查我的其他问题以获取表结构、示例输入和输出。http://stackoverflow.com/questions/14071312/combining-rows-from-multiple-tables-with-different-number-of-columns/
-
@user1593175 啊,所以你想从三个表中的任何一个中随机抽取 10 行?你在用 PageIndex 做什么?当您请求第 1 页,然后再次请求第 1 页时,您将不会得到相同的结果,因为您将它们重新洗牌。这似乎是你想要的,但在那里有 PageIndex 似乎完全没有必要。我也怀疑您是如何选择随机行的,this question 对此部分有更多详细信息和替代方案。
标签: sql sql-server stored-procedures sql-server-2008-r2 union