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

时间:2015-05-13 12:42:11

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

纯粹是出于好奇。

public class RootObject
{
    public List<IDictionary<string, string>> AlertDataList { get; set; }
}

我希望变量中此表中第3行的值。即&#34; lmno&#34;

如果我这样做:

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')

我会得到pqrs。

我不能用这个:

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

print @value

因为

  

窗口函数不支持整数索引作为ORDER BY子句   表达式。

任何选项?

编辑: 如果我将其查询为

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

我按照插入顺序获取记录。这意味着某处有关于如何插入的记录。我只想捕捉这个序列。

5 个答案:

答案 0 :(得分:3)

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

您需要添加一个新列作为您想要的“订单”,否则您必须更好地定义记录集中您希望{} 的原因,因为pqrs在此无意义感。

编辑:没有记录插入记录的顺序。有一个顺序将记录返回到记录集,并且它们自然位于DB下面的结构中,但它是任意的。你按照它们编写的顺序将它们恢复的原因是因为你在RDBMS上有一个小小的表,它将数据存储在一个地方。一旦扩展了体系结构,这就失败了。您不能也不应该依赖RDBMS检索记录的顺序。

答案 1 :(得分:1)

让我们一步一步地看一下。

select ename from test order by ename;

这是由ename命令。

select ename from test order by 1;

这里1是select子句中第一个元素的别名,它是ename。所以你再次通过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。)

至于&#34;我确实按照插入顺序获取记录。这意味着某处有关于如何插入的记录。我只想捕捉这个序列。&#34;:不,不是这样的。现在你碰巧按照插入的顺序获取记录,但这绝不是保证。保证订单的唯一方法是使字段表示所需的订单并在ORDER BY中使用它们。

答案 2 :(得分:0)

尝试此代码

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

答案 3 :(得分:-1)

WITH MyCte AS 
(
    SELECT *, row_number() OVER(ORDER BY (SELECT 0)) ID FROM test
)
SELECT  *
FROM    MyCte
WHERE   ID = 3

答案 4 :(得分:-3)

尝试:

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