Sql 从多个表中选择,按限制对记录进行排序,并将它们合并/联接在一起

Sql 从多个表中选择,按限制对记录进行排序,并将它们合并/联接在一起,sql,sql-server,Sql,Sql Server,我有以下存储过程: CREATE PROCEDURE [dbo].[P24GamesByCategoryDesktopEn] @Index int AS Begin SELECT GameName, IMG380X380, GameCode, '9' AS ProviderID FROM BGames WHERE GameType = 'slots' UNION ALL SELECT Name, ImageUrl, GameID

我有以下存储过程:

CREATE PROCEDURE [dbo].[P24GamesByCategoryDesktopEn]
    @Index int
AS
Begin
    SELECT GameName, IMG380X380, GameCode, '9' AS ProviderID  
    FROM BGames 
    WHERE GameType = 'slots' 
    UNION ALL
    SELECT Name, ImageUrl, GameID        , '12' AS ProviderID  
    FROM EGame 
    WHERE Type = 'slots' 
    ORDER BY GameName OFFSET @Index ROWS FETCH NEXT 4 ROWS ONLY
END
我想从两个不相关的表中选择一些记录,它们之间没有关系。然后我想使用“union”语法将两个表的结果合并到一个结果集中

但是,查询不起作用,因为order子句与发生并集后的结果集相关。这意味着从其中一个表返回更多记录。。但是我需要从每个select查询返回相同数量的结果。 我想在每个select语句之后使用ORDERBY子句,但sql server不允许使用这种语法

如何将表及其结果合并到一个结果集中


注意,我不想执行select子查询或创建许多临时表。这是因为我要在存储过程中添加更多的select语句。我不希望它效率低下或过于复杂。

我想你可以通过行数来解决这个问题。 这是同一个表的两个选择,但可能是不同的表

SELECT [AuctionId]
      ,[UserId]
      ,[BiddingPrice]
      ,[DateTime]
      ,9 as [source] 
      ,ROW_NUMBER() over (order by [DateTime] asc) as rn
  FROM [Test].[dbo].[Bid] 
union all
SELECT [AuctionId]
      ,[UserId]
      ,[BiddingPrice]
      ,[DateTime]
      ,12 as [source]
      ,ROW_NUMBER() over (order by [DateTime] desc) as rn
  FROM [Test].[dbo].[Bid] 
ORDER BY rn, source OFFSET 2 ROWS FETCH NEXT 4 ROWS ONLY

您几乎只需要将您想要排序的不同查询打包,并在CTE中分页,如下所示:

DECLARE @Index int = 0, @NbrOfRows int = 4

; WITH CTE1 AS (
    SELECT GameName, IMG380X380, GameCode, '9' AS ProviderID  
    FROM BGames 
    WHERE GameType = 'slots'
    ORDER BY GameName
    OFFSET @Index ROWS FETCH NEXT @NbrOfRows ROWS ONLY
), CTE2 AS (
    SELECT Name, ImageUrl, GameID, '12' AS ProviderID  
    FROM EGame 
    WHERE Type = 'slots' 
    ORDER BY GameName
    OFFSET @Index ROWS FETCH NEXT @NbrOfRows ROWS ONLY
)
SELECT * FROM CTE1
UNION ALL
SELECT * FROM CTE2

您只需要向列添加命名,以便它们在联合的末尾符合您的要求。

为什么不运行两个语句,每个表一个?我不确定当我尝试使用C接收它时,它将如何工作。是否可以迭代这些结果?例如,可以使用linq?@danmann将这样的结果分配给C中的模型类吗?因此,如果您想在fetch语句中返回4行,这意味着您需要从第一个select语句中返回4行,从第二个select语句中返回4行?或者2+2,不管怎样,我的观点是你希望它能像那样工作?不幸的是,工会就是这样工作的。是的@MK_。我还希望每个语句的排序也能起作用。答案不错,但同样的问题也存在。它将从所有结果集中的第二行记录返回4行。我想为每个select语句返回4行,而不是全部返回。这是一个有趣的想法。它比使用单独的SELECT语句更有效吗?使用SELECT1 UNION ALLECTORTET2效率不高,它与它非常相称,但是它使您有能力做您想做的事情——从源表中的每一个执行不同的排序,并基于该排序使用偏移获取子句。