主题:请问这个SQL应该怎么写
小新0574
[专家分:0] 发布于 2006-04-09 14:43:00
有这么两个表
cust_tbl
cust_id title e_first_name e_last_name address1 .
0 MR Martin Ma .
1 MR Kirs Cheung .
2 MR Ricky Chan .
3 MR Tom Kwan .
4 MR Corporate Default Corporate Default .
5 MRS Mary Mok .
. . . . .
acc_grp_cust_tbl
acc_group Cust_id1 Cust_id2 Cust_id3 Cust_id4
1400 0 1 2
1500 3 4
1600 5
. . . . .
. . . . .
如何根据上面两个表使用SQL显示出这样一个表
ACC_GROUP PAYEENAMES
1400 Ma Martin/Cheung Kris/Chan Ricky
1500 Kwan Tom/Corporate Default Corporate Default
1600 Mok Mary
. .
. .
回复列表 (共24个回复)
21 楼
爱喝咖啡 [专家分:20] 发布于 2006-05-13 13:49:00
[quote]"但是标准sql也有同样的类似函数就是case when then else end 的标准结构"
我也没有吵架的那个意思.可以欣赏下仁兄标准的sql语句不?[/quote]
朋友看来你真的没用过oracle,decode其实就是case when只不过oracle重新封装了一下,用起来方便少写几个字而已。
前面说的话别放在心上,看你说的那么肯定,语气稍微有点冲。
改成标准sql的语句如下,其实我的语句和你的想法一样只是你是希望修改表结构,我直接用sql把结构改成纵表了。
select acc_group,MAX(case when id = '1' then name end)||MAX(case when id = '2' then '/'||name end)||
MAX(case when id = '3' then '/'||name end)||MAX(case when id = '4' then '/'||name end)
FROM (
select '1' id,acc_group,Cust_id1 Cust_id,e_last_name||' '||e_first_name name
from acc_grp_cust_tbl a,cust_tbl b where a.cust_id1 = b.cust_id
union all
select '2' id,acc_group,Cust_id2,e_last_name||' '||e_first_name name
from acc_grp_cust_tbl a,cust_tbl b where a.cust_id2 = b.cust_id
union all
select '3' id,acc_group,Cust_id3,e_last_name||' '||e_first_name name
from acc_grp_cust_tbl a,cust_tbl b where a.cust_id3 = b.cust_id
union all
select '4' id,acc_group,Cust_id4,e_last_name||' '||e_first_name name
from acc_grp_cust_tbl a,cust_tbl b where a.cust_id4 = b.cust_id) a
GROUP BY acc_group
22 楼
kdm0514 [专家分:5210] 发布于 2006-05-13 18:02:00
我确实没有用过ORACLE
看你的代码,是把Cust_id1 Cust_id2 Cust_id3 Cust_id4分4个case进行分别处理了.
我的工作是程序,程序受制于数据库的结构,所以看到别人数据库表建成那样难免生气. 所以...
见笑了. 你的程序我看了 佩服!
23 楼
rr5566 [专家分:460] 发布于 2006-05-17 15:11:00
呵呵其实一个好的数据库也不是那么容易建的。呵呵。
24 楼
大海兄 [专家分:50] 发布于 2006-05-22 07:50:00
把第二个表的行列转变一下
两个表之间就要相同的列
可以建立视图
我来回复