SQL语言优缺点的讨论

anxue 2003-01-06 09:08:47
大家在使用SQL语言的时候是不是有很多用起来不太方便的地方呢?
比如说:SQL 有Union可以合并记录集,但是我想从一个记录集中去掉一些记录的时候,就没有很方便的方法,如果主键只有一个还好办,not in就好了,但是主键如果是多个就比较麻烦。
...全文
391 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgs6715 2003-01-06
  • 打赏
  • 举报
回复
创建视图:

create view test3 as
select decode(sign(E.B),-1,0,
decode(sign(E.B-500),-1,E.B*0.05,
decode(sign(E.B-2000),-1,E.B*0.1-25,
decode(sign(E.B-5000),-1,E.B*0.15-125,
decode(sign(E.B-20000),-1,E.B*0.20-375,
decode(sign(E.B-40000),-1,E.B*0.25-1375,
decode(sign(E.B-60000),-1,E.B*0.30-3375,
decode(sign(E.B-80000),-1,E.B*0.35-6375,
decode(sign(E.B-100000),-1,E.B*0.40-10375,
B*0.45-15375
))))))))) personal_tax,E.C emp_id
from
(select (sum1+sum2+sum3+sum4+sum6-800) B,p1.emp_id C from
(select emp_id,sum(amount) sum1 from
payment_item where item_id in (0101,0102,0103,0104,0148)
and to_char(pay_date,'yyyy-mm')='2002-12' group by emp_id)p1,
(select emp_id,sum(amount)-decode(emp_id,4,500,
156,500,186,500,190,500,526,500,626,500,300) sum2
from payment_item where item_id in (0301,0308,0309)
and to_char(pay_date,'yyyy-mm')='2002-12' group by emp_id)p2,
(select emp_id,sum(amount) sum3 from payment_item
where item_id in (0110,0111,0206)
and to_char(pay_date,'yyyy-mm')='2002-12'
group by emp_id)p3,
(select emp_id,amount sum4 from payment_item
where item_id in (9999) and pay_id=2
and to_char(pay_date,'yyyy-mm')='2002-12')p4,
(select emp_id,sum(amount) sum6 from payment_item
where item_id in (0152,0153,0154)
and to_char(pay_date,'yyyy-mm')='2002-12'
group by emp_id)p6
where p1.emp_id=p2.emp_id
and p1.emp_id=p3.emp_id
and p1.emp_id=p4.emp_id
and p1.emp_id=p6.emp_id)E
lgs6715 2003-01-06
  • 打赏
  • 举报
回复
SQL> desc test3;//是个视图,由多个表字段组成
名称 是否为空?类型
------------------------------- -------- ----
PERSONAL_TAX NUMBER
EMP_ID NOT NULL NUMBER(4)

SQL> desc payroll_item;//是张表
名称 是否为空?类型
------------------------------- -------- ----
PAY_ID NOT NULL NUMBER(2)
EMP_ID NOT NULL NUMBER(4)
ITEM_ID NOT NULL CHAR(4)
AMOUNT NUMBER(12,2)


update payroll_item
set amount=(
select personal_tax
from test3
where test3.emp_id=payroll_item.emp_id)
where exists (select * from test3 where test3.emp_id=payroll_item.emp_id)
and payroll_item.item_id='0157'
and payroll_item.pay_id=11;

这里是该没问题的,但是结果没出来,不知道怎么回事情?
PERSONAL_TAX与AMOUNT类型大小不一致---这个原因??
视图字段结构可以改的吗》》?没听说过
如何解决?
三杯倒 2003-01-06
  • 打赏
  • 举报
回复
从一个记录集中去掉一些记录可以用minus

select id from table1
minus
select id2 from table2
yuxuan 2003-01-06
  • 打赏
  • 举报
回复
where test3.emp_id=payroll_item.emp_id

where条件中不能调用子查询的表中字段
beckhambobo 2003-01-06
  • 打赏
  • 举报
回复
PERSONAL_TAX与AMOUNT类型大小不一致
lgs6715 2003-01-06
  • 打赏
  • 举报
回复
SQL> desc test3;//是个视图,由多个表字段组成
名称 是否为空?类型
------------------------------- -------- ----
PERSONAL_TAX NUMBER
EMP_ID NOT NULL NUMBER(4)

SQL> desc payroll_item;//是张表
名称 是否为空?类型
------------------------------- -------- ----
PAY_ID NOT NULL NUMBER(2)
EMP_ID NOT NULL NUMBER(4)
ITEM_ID NOT NULL CHAR(4)
AMOUNT NUMBER(12,2)


SQL> update payroll_item
2 set amount=(
3 select personal_tax
4 from test3
5 where test3.emp_id=payroll_item.emp_id)
6 where test3.emp_id=payroll_item.emp_id
7 and payroll_item.item_id='0157'
8 and payroll_item.pay_id=11;
where test3.emp_id=payroll_item.emp_id
*
ERROR 位于第 6 行:
ORA-00904: invalid column name
为什么会报这个错误》??
原因何在???
yuxuan 2003-01-06
  • 打赏
  • 举报
回复
做技术就是要不断解决问题,怕麻烦也不行,问题总有解决办法
beckhambobo 2003-01-06
  • 打赏
  • 举报
回复
烦只是问题还存在,不代表sql不方便、不好用。
cyberflying 2003-01-06
  • 打赏
  • 举报
回复
等熟悉SQL以后,你会发现很好玩的:)

学习SQL中……
jlandzpa 2003-01-06
  • 打赏
  • 举报
回复
没觉得怎么麻烦呀.
wanghai 2003-01-06
  • 打赏
  • 举报
回复
很强大的功能
okcsdn 2003-01-06
  • 打赏
  • 举报
回复
SQL的功能还是很强大的,如果效率放在第二位,那么几乎所有功能都可你实现。

就是有时候麻烦些。

不过还是挺不错的。

17,090

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧