求教SQL语句,我曾经问过,但是没人回答我。其实不难,快快快!我把剩下的分全加上了。(200分)

  • 主题发起人 主题发起人 karibu
  • 开始时间 开始时间
K

karibu

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在使用select查询时增加一个字段(比如叫做sn),使得字段的各个记录的内容
为从1..n按自然数排列。

就是说,如何使用select字段增加一个记录序号的字段。
 
Oracle中有rownumber,可以。
SQL Server中就麻烦了。
 
用计算字段吧,你这样做不到的。
 
若为Orcale:select identity(int,1,1) as 'line_no',* form table1 order by needorder

若为MSSQL:select identity(int,1,1) as 'line_no',*
into #temp
form table1 order by needorder
select * from #temp
drop table #temp
 
补充一下,如何在ACCESS中实现?
 
alter table 表
add sn int IDENTITY(1,1)
其实在Delphi调用数据集的recordno就可了














//y
// noaa/

 
同意zyycc的方法,在MSSQL中结合identity(int,1,1)使用临时表的方法应该是
比较合理的方法。
我也曾经用dataset的计算字段的方法实现过,麻烦一点点。
而tangzwei采用Alter Table的方法不可取。
 
先在你的查询的QUERY(叫QUERY1)里增加一个计算字段(fkCalculated)叫做sn

private
bklist:tlist;
procedure addtolist;
procedure Query1aGetText(Sender: TField; var Text: String;DisplayText: Boolean);
function BSearch(dataset:TDataset;sbmark: TBookmark; bmarkList: tlist): integer;

procedure TForm1.addtolist;
begin
bklist:=tlist.Create;
query1.first;
query1.DisableControls;
while not query1.eof do
begin
bklist.Add(query1.getbookmark);
query1.next;
end;
query1.first;
query1.EnableControls;
query1.FieldByName('sn').OnGetText:=query1aGetText;
end;
procedure TForm1.Query1aGetText(Sender: TField;
var Text: String; DisplayText: Boolean);
var
ab:TBookMark;
begin
if not query1.IsEmpty then
if bklist.Count<>0 then
begin
ab:=query1.getbookmark;
text:=inttostr(BSearch(query1,ab,bklist)+1);
query1.freebookmark(ab);
end;

end;

function TForm1.BSearch(dataset:TDataset;sbmark: TBookmark; bmarkList: tlist): integer;
var
sIndex,eIndex,midIndex,ipos:integer;
begin
try
result:=dataset.comparebookmarks(sbmark,bmarkList[0]);
if result=0 then Exit
else result:=-1;
except
end;
sIndex:=0;
eIndex:=bmarkList.Count-1;
while (result= -1) and (sindex<>eindex) do
begin
midIndex:=(sIndex+EIndex+1) div 2;
ipos:=dataset.comparebookmarks(sbmark,bmarkList[midIndex]);
if ipos=0 then
result:=midIndex
else
if ipos<0 then
eIndex:=midIndex
else sIndex:=midIndex;
end;
end;

然后只要你每次查询后调用addtolist 就可以把你的记录序号增加进去了。
如果DBGRID有字段,也要增加进去了。最后在关闭窗体时释放BKLIST
 
Access不支持identity()函数
 
to sunys:不用这么复杂吧!
下面的方法绝对管用:

增加一个计算字段,假设为xh
声明一个链表list:Tstringlist;
在adodataset的open事件中:
if list=nil then
list:=Tstringlist.create;
list.clear;
if adodataset.isempty then
exit;
adodataset.first;
while not adodateset.eof do
list.add(adodataset.fieldbyname('主键').asstring;

在改计算字段xh的gettext事件中
text;=inttostr(list.indexof(adodataset.fieldbyname('主键').asstring);
就行了
简单吧!!!



 
增加计算字段No,在No的ongettext事件中加上:
Text:=inttostr(ADODataSet.RecNo);
运行即可。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
473
import
I
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
后退
顶部