【问题标题】:How to do an inner join on row number in sql server如何对sql server中的行号进行内部连接
【发布时间】:2012-10-19 10:27:08
【问题描述】:

SQL Server 2008

两个表:

表A有以下数据:

RowA
RowB
RowC
RowD

表B有以下数据:

Row4
Row3
Row2
Row1

我想得到以下输出:

RowA Row1
RowB Row2
RowC Row3
RowD Row4

两个表唯一共同的值是行号

我当然可以单独获取数据:

SELECT val
FROM A
ORDER BY val

SELECT val
FROM B
ORDER BY val

但是如何加入行号?

如果我没有 order-by,但只希望行按它们出来的顺序怎么办?

RowA Row4
RowB Row3
RowC Row2
RowD Row1

在连接中

SELECT val
FROM A

SELECT val
FROM B

【问题讨论】:

  • 请注意:只要您没有明确指定ORDER BY,从表中返回行的顺序不保证。明天可能会有所不同......因此,根据它们在或多或少随机输出序列中的“序数”位置链接来自两个不同表的两行是不可重现且不可靠的。如果您的两个表没有任何共同点 - 基本上,您无法真正“连接”任一表中的两个数据集...
  • 我意识到,但在我的现实生活中,这两个表来自函数并且将始终处于相同的顺序

标签: sql sql-server sql-server-2008


【解决方案1】:

试试这个:

在 sql server 2008 中使用 ROW_NUMBER() 函数

select A.val,B.val 
from(
    SELECT val,row_number() over (order by val) as row_num
    FROM A)A
join
    (SELECT val,row_number() over (order by val) as row_num
    FROM B)B
on  A.row_num=B.row_num
ORDER BY A.val,B.val


SQL fiddle demo

【讨论】:

  • 这看起来是一个好的开始,但是如果我没有订单怎么办
  • @Graham:您可以通过(选择 0)下订单,因为那里的 order by 子句是强制性的。请参阅此处sqlfiddle.com/#!3/9e5bf/5
  • 这个简单的操作还没有以某种方式实现,这绝对让我大吃一惊。
【解决方案2】:
select A.sectionname, A.Basicprice,A.Brand,A.Description,A.Description,A.Grandtotal,A.GST,A.Gstvalue,A.Hsncode,A.Image,A.Installationcharge,A.Model,B.Age,B.Mark,B.Name,B.class

from(
   SELECT Class,row_number() over (order by class) as row_num,Age,Mark,Name
   FROM classtable)B
   LEFT join
   (SELECT sectionname,row_number() over (order by sectionname) as row_num,Basicprice,Brand,Description,Grandtotal,GST,Gstvalue,Hsncode,Image,Installationcharge,Model
   FROM testtable)A

on  A.row_num=B.row_num

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    相关资源
    最近更新 更多