获取没有主键的行的特定列的值

Get value of a specific column of a row without primary key

这纯粹是出于好奇。

create table test (ename varchar(50))
insert into test values ('abcd')
insert into test values ('pqrs')
insert into test values ('lmno')
insert into test values ('xxxx')
insert into test values ('tops')

我想要这个 table 中第 3 行的值在一个变量中。即 "lmno"

如果我这样做:

Declare @value varchar(50)
Select @value = ename from 
(
 select Row_number() over(order by ename) Rowno, * from test 
) X where Rowno=3

print @value

我会得到pqrs。

我不能使用这个:

Declare @value varchar(50)
Select @value = ename from 
(
 select Row_number() over(order by 1) Rowno, * from test 
) X where Rowno=3

因为

Windowed functions do not support integer indices as ORDER BY clause expressions.

有什么选择吗?

编辑: 如果我将其查询为

Select * from test

我确实按照插入顺序获取记录。这意味着在某个地方有关于它们是如何插入的记录。我只想捕捉这个序列。

您对 RDBMS 的假设非常非常糟糕。 RDBMS 存储记录的顺序,或者它们写入 table 的顺序是 100% 绝对无关紧要的。这不代表任何意思。它是任意的,你不能依赖它。

您需要添加一个新列作为您想要的 'order',或者您必须更好地定义为什么要在记录集中添加 pqrs,因为 3rd record在这个意义上是没有意义的。

对您的编辑:没有记录插入顺序的记录。记录返回记录集有一个顺序,它们自然位于下面的数据库结构中,但它是任意的。您按写入顺序取回它们的原因是因为您在 RDBMS 上有一个很小的 ​​table 将数据存储在一个位置。一旦您向上扩展架构,这就会失败。您不能也不应该依赖 RDBMS 检索记录的顺序。

尝试:

create table #test (ename varchar(50))
insert into #test values ('abcd')
insert into #test values ('pqrs')
insert into #test values ('lmno')
insert into #test values ('xxxx')
insert into #test values ('tops')

CREATE TABLE #Temp(RowID INT PRIMARY KEY IDENTITY(1,1), ename VARCHAR(10))

INSERT INTO #temp(ename)
SELECT ename from #test

SELECT T2.*
FROM #temp T1
JOIN #test T2 ON T1.ename = T2.ename
WHERE T1.RowID = 3
WITH MyCte AS 
(
    SELECT *, row_number() OVER(ORDER BY (SELECT 0)) ID FROM test
)
SELECT  *
FROM    MyCte
WHERE   ID = 3

我们一步步来看

select ename from test order by ename;

这是按姓名订购的。

select ename from test order by 1;

这里的 1 是 select 子句中第一个元素的别名,即 ename。所以你又按名字点了。

select Row_number() over(order by ename) Rowno, * from test 

row_number 函数适用于按 ename 排序的记录。

select Row_number() over(order by 1) Rowno, * from test 

这里的 1 是什么意思?我们在 over 子句中,没有 1 可以引用的第一个元素。所以这里不允许使用数字(这只会造成混淆,因为对于每条没有订购任何东西的记录,它只能表示字面上的 1)。

至于"I do get records in the order in which they were inserted. That means somewhere there is a record as to how they were inserted. I just want to capture this sequence.":不,事实并非如此。现在您碰巧按照插入的顺序获取记录,但这绝不能保证。保证顺序的唯一方法是使用字段来表示所需的顺序并在 ORDER BY 中使用它们。

试试这个代码

create table test (ename varchar(50))
insert into test values ('abcd')
insert into test values ('pqrs')
insert into test values ('lmno')
insert into test values ('xxxx')
insert into test values ('tops')

SELECT  *FROM (
SELECT ROW_NUMBER() over (order by HH) AS RNO,ename FROM (SELECT  ENAME,'' AS HH FROM test) T)T1
WHERE RNO=3