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

时间:2018-04-01 14:35:35

标签: sql sql-server

我有以下存储过程:

<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <div id="message2" ></div>  <!-- notice that it was expanded -->
        <div id="message1" >Hello</div>
    </body>
</html>

我想从两个不相关的表(它们之间没有关系)中选择一些记录。然后我想使用'union'语法将两个表的结果连接到一个结果集中。

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

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

注意,我不想做select子查询或创建许多临时表。多数民众赞成因为我要在存储过程中添加更多的select语句。我不希望它效率低下或过于吵闹。

2 个答案:

答案 0 :(得分:0)

我想你用row_number()来解决这个问题 这是同一个表的两个选择,但它可以是不同的表。

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

答案 1 :(得分:0)

您几乎需要将您想要订购的不同查询和CTE中的“paginate”结合起来,如下所示:

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

您只需要为列添加命名,以便它们符合您希望它们位于联合的末尾。