一个SQL语句如何写的问题!请各路高手提提意见,弄的我头晕了也没有弄出来!faint---(300大洋) (300分)

  • 主题发起人 主题发起人 jrq
  • 开始时间 开始时间
balaschen说的方法在SQLServer2K上应该可以解决你的问题,但是在Oracle8.17上就不清楚
了没在Oracle上转过不敢妄言。
 
晕倒.........
 
加个自增字段后用内联!!!
也就是Balaschen方法需要改进!
因为XH的值没有确定性,所以数据多而且乱(就是NAME千奇百怪)的话XH可能导致很多地区值都一样
这样优先按XH排序导致
A 河北 10
B 河北 10
。。。
C 北京 20
这样结果。
所以需要增加一个自增INT字段ID(基本所有数据库都有这种类型,没有任何问题),
SQL改为(这样就可以保证XH的值对于每行值都是确定且不同)
Select Name,Local,Age,
XH=(Select Count(*) from List A where A.Local=B.Local and A.ID<B.ID)
from List B order by XH,Local
 
这是SQL_PLUS的运行结果!

SQL> Select Name,Local,Age,
2 XH=(Select Count(*) from List A where A.Local=B.Local and A.Name<B.Name)
3 from List B order by XH,Local

SQL> run
1 Select Name,Local,Age,
2 XH=(Select Count(*) from List A where A.Local=B.Local and A.Name<B.Name)
3* from List B order by XH,Local
XH=(Select Count(*) from List A where A.Local=B.Local and A.Name<B.Name)
*
ERROR 位于第 2 行:
ORA-00923: 未找到预期 FROM 关键字
------------------------
看来是XH=(Select Count(*) from List A where A.Local=B.Local and A.Name<B.Name)当中
的 from list A 不认识啊!

我再检查检查SQL 语句! 看来要翻书
 
用标准的写法试试:
Select Name,Local,Age,
(Select Count(*) from List As A where A.Local=B.Local and A.Name<B.Name) As XH
from List As B order by XH,Local
实在不行这么写:
Select Name,Local,Age from
(Select Name,Local,Age,
(Select Count(*) from List As A where A.Local=B.Local and A.Name<B.Name) As XH
from List As B) As List order by XH,Local
Sybase11.5,DB2都能支持
 
我没有用过ORACLE,平时我写SQL只参照SQL 92标准
每个地方加AS.这个是SQL 92标准的写法。我想ORACLE不会不支持吧
Select Name,Local,Age,
XH=(Select Count(*) from List AS A where A.Local=B.Local and A.ID<B.ID)
from List AS B order by XH,Local
//其实括号里的LIST 不用AS
Select Name,Local,Age,
XH=(Select Count(*) from List where Local=B.Local and ID<B.ID)
from List AS B order by XH,Local
//还有,XH还是用自增字段才不会错,用NAME求COUNT有问题

 
》Select Name,Local,Age,
》XH=(Select Count(*) from List A where A.Local=B.Local and A.Name<B.Name)
》from List B order by XH,Local
-------------------------------------
我又颠颠的跑到了SQL SERVER 2k 中,在以前的一个库中加了这张表list,
执行如下,结果运行良好!
也实现了要求!
procedure TForm1.Button1Click(Sender: TObject);
var str:string;
begin
str:='Select Name,Local,Age, '+
' XH=(Select Count(*) from List A where A.Local=B.Local and A.Name<B.Name)'+
' from List B order by XH,Local ';
query1.Close;
query1.SQL.Clear;
query1.SQL.Add(str);
query1.open;
end;
----------------------
看来在SQL_SERVER中可以,但在oracle中不行,怎么办?
我没有遇到过这种情况! 请大家继续关注!
 
越来越看不懂了! 发晕!
to balaschen: 我体力不支了,您的代码我没有修改,直接copy的!
2个都提示了信息~
麻烦您再看看! 3Q
---------------------------
SQL> Select Name,Local,Age,
2 (Select Count(*) from List As A where A.Local=B.Local and A.Name<B.Name) As XH
3 from List As B order by XH,Local;
(Select Count(*) from List As A where A.Local=B.Local and A.Name<B.Name) As XH
*
ERROR 位于第 2 行:
ORA-00907: 缺少右括号
---------------------------------
SQL> Select Name,Local,Age from
2 (Select Name,Local,Age,
3 (Select Count(*) from List As A where A.Local=B.Local and A.Name<B.Name) As XH
4 from List As B) As List order by XH,Local
5 ;
(Select Count(*) from List As A where A.Local=B.Local and A.Name<B.Name) As XH
*
ERROR 位于第 3 行:
ORA-00907: 缺少右括号
=============================
to onedot:刚才机子重起了一次,现在才看到您的留言!
谢谢!
我现在就建另外一张表,试试您的说的!
3Q!
 
To Onedot:
我不懂你所说的Name千齐白怪时会出错的推论,事实上只有当“姓名”和“地区”同时相同时
才会出现你所说的情况,但实际应用中比如:
张三 河北 10
张三 河北 12
张三 河北 10
会有意义吗?你怎么区分两条完全相同的记录?关系数据理论本身就不允许!
实际应用中一般都会有“编号”等唯一性的字段,我们探讨的是解决问题的思路
而不是具体的答案。
 
我想问一问,这样做的目的是什么?业务需要?还是其他?
 
一个SQL语句是不能完成的.建议用一个中临时表进行数据处理.这样容易一些.
 
to 荷兄:是业务上的需要! 被要求这样做到的! :( 谢谢关注! 3Q!

to Andisof: 在SQL_SERVER 中已经实现了 只是在oracle中还有问题! 谢谢关注! 3Q!
 
no,我不会,我也头昏啊!
 
TO balaschen:
不要急,我不是抹杀你功劳的说。我不要分
但是你的写法确实不严密,所以我就是探讨思路,如果如你说只要具体答案,我就不罗嗦了!
再说如果别人表里还有其他字段,而NAME可能重名呢?//同名同姓多了!
这只和实际数据有关,和数据库结构无关//如果真的不允许同名那才是问题吧!
写完这次我不回了,我实在觉得现在的DFW。。。。
 
to :balaschen 、onedot两位仁兄:
谢谢你们的帮助!
今天非常感激!
onedot老兄暂不要生气! 同为搞技术的,就象您说的:探讨思路是应该的,
对大家都有好处,可以学习!
》》写完这次我不回了,我实在觉得现在的DFW。。。。
我看这个还是收回吧!~ [:D][:D]

BTW: 谢谢楼上各位!都有分! 结贴后给您两位再加,我看了看 ,家产还有不少呢~ [:D][:D]
 
To Onedot:
看来你误会我的意思了,不好意思:)
我上面的原话:“实际应用中一般都会有“编号”等唯一性的字段,我们探讨的是解决问题的思路
而不是具体的答案”我指的就是探讨思路。
 
to jrq:你经常帮我,现在我也帮你-有会题只能up..............
 
to jrq:
Onedot补充的做法应该能解决问题。我记得好像ORACLE数据库有一个缺省的列名:ROWID
这是一个唯一值。
我现在这边没有环境,没法儿做测试了。
 
绝对可用,只是执行效率不高
select a.name,a.local,a.age from list a,list b
where a.local=b.local and a.name>=b.name
group by a.name,a.local,a.age
order by count(*) ,local

给我分,[:)]
 
但我想找不出更高效率的SQL了,需求太怪
 

Similar threads

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