100分求一Query语句(100分)

  • 主题发起人 主题发起人 successlikun
  • 开始时间 开始时间
S

successlikun

Unregistered / Unconfirmed
GUEST, unregistred user!
SQL 2000中有表:
Level字段,数据为
01
0101
0102
010101
010201 如何实现根据给定的数得出上级数据
例如 给出010101,得到0101,01
 
select * from table where '010101' like level+'%'
应该可以吧
 
select * from table where level like '01%' and level not in (select level
from table where level like '010101%'
 
数据库设计不合理
 
select table1.level,table2.level from table1,table2 where table1.level=
copy(table3.fieldbyname['level'].asstring,1,4) and table2.level=
copy(table3.fieldbyname['level'].asstring,5,6)
 
select * from XXX where level in ('010101')
 
各位兄弟:100分的问题可不是这么简单。现在项目都到收尾阶段,头把我们逼得很紧,
数据库都定型了,所以才用100分求QUERY语句。谁答对了再送一百分。
不要用简单的思维考虑回答我!
这个问题我再解释一次:表名:BranchStruct,其一字段BranchLevel(表示等级)
比如 编号01为父公司,0101,0102为一级子公司,010101,010102为0101子公司的子公司。
任意根据给出的编号,得出其所有上级公司编号。
简单的说:编号0101020101,其上级分别为:01010201,010102,0101,01。
Delphi中很好得出,但我要的是一Query语句。(在强调一句,给出的编号是任意的)
 
To: successlikun
我已想出来,不过你凭什么有200分? 你总积分才100?
我喜欢回答那些为提高水平而常上大富翁的人,而不是有事才上大富翁的人。
 
我把我的可怜的分全交出来,,,大哥大姐们!!!!!!
 
create procedure up
@bh varchar(20)
as
while (len(@bh)>2)
begin
print @bh
set @bh=left(@bh,len(@bh)-2)
end
print @bh
 
可以使用Delphi+SQL的做法
procedure TForm1.Button1Click(Sender: TObject);
var
SQL,Temp:string;
Fas:TStringList;
i:integer;
begin
Temp:=Edit1.Text;
Fas:=TStringList.Create;
for i:=(Length(Temp) div 2)-1 downto 1 do
begin
Temp:=Copy(Temp,1,i*2);
Fas.Add(Temp);
end;
SQL:='';
SQL:='select u from t where u in ';
SQL:=SQL+'(';
if Fas.Count=0 then
begin
Exit;
end
else
begin
if Fas.Count=1 then
begin
SQL:=SQL+''''+Fas.Strings[0]+'''';
end
else
begin
for i:=0 to fas.Count-2 do
SQL:=SQL+''''+fas.Strings+''',';
SQL:=SQL+''''+Fas.Strings[Fas.count-1]+'''';
end;
end;
SQL:=SQL+')';
ShowMessage(SQL);
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add(SQL);
Query1.Open;
end;
 
query1.sql.text:='select * from XXX where (level in ("+edit1.text+'")) and (leverl<>"'
+edit1.text+'")'
拜托,这样就行了!!!!!

 
如果你的编码长度定的话,可以做,如楼上所言
 
create procedure up
@bh varchar(20),@length int
as
declare a1 varchar(10),
declare a2 varchar(10),
declare a3 varchar(10),
;
declare i int,
set i=1
while i<length
a1:=left(@bh,i,2)


select * from tablename where bh in (a1,a2,a3,a4..)


end
 
query1.sql.text:='select * from XXX where (level in ("+edit1.text+'")) and (leverl<>"'
+edit1.text+'")'
拜托,这样就行了!!!!!
 
你是公司或子公司的编码应该是长度定的吧,那不就好实现了。
select * from table where level like 'XXXXXXXX的前 N 位' and level not in
(select level from table where level like 'XXXXXXXX%')

'XXXXXXXX的前 N 位' 可以用自己的代码或自定义函数得到
N 是公司或子公司的编码的长度

 
有一个简单的100%正确的办法:
一般第一级的长度是确定的,假设为2位长度,要查的的编码为‘XXXXXXXXX',语句为
select * form ta where level>=substring('XXXXXXXX',1,2)
and level<=substring('XXXXXXXX',1,(len('XXXXXXXX')-1))
使用上述语句当然要注意数据库排序规则,一般情况下是没问题的。
 
试试:
select BranchLevel
from BranchStruct
where '010101' like BranchLevel+'%'
and BranchLevel<>'010101'
 
select * from BranchStruct
where substring('010201002',1,Len(Level)) = Level
搞定
 
select * from BranchStruct
where substring('010201002',1,Len(Level)) = Level
and Level <> '010201002'
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
923
SUNSTONE的Delphi笔记
S
D
回复
0
查看
848
DelphiTeacher的专栏
D
后退
顶部