例子:
table1基本信息
userId(唯一),basemomeny
1 100
2 200
3 500table2变化的信息
id(自增) userId(table1的外键) yearmonth momeny
1 1 201108 200
2 1 201109 500
3 2 201107 700
4 2 201109 800
5 2 201110 750假设table1为基本的工资金额,如果工资金额有变动则记录到表table2中,且记录变动的月份。
想获得这样一个结果:
userId basemomeny yearmonth momeny
1 100 201109 500
2 200 201110 750
3 500 空 空
即变化的信息table2,同一个userid取月份最大的那条记录跟table1做个链接,如果一个sql实现呢。还有取没有变化的userid的话
是直接 select * from table1 where userid not in (select userid from table2) 吧。
table1基本信息
userId(唯一),basemomeny
1 100
2 200
3 500table2变化的信息
id(自增) userId(table1的外键) yearmonth momeny
1 1 201108 200
2 1 201109 500
3 2 201107 700
4 2 201109 800
5 2 201110 750假设table1为基本的工资金额,如果工资金额有变动则记录到表table2中,且记录变动的月份。
想获得这样一个结果:
userId basemomeny yearmonth momeny
1 100 201109 500
2 200 201110 750
3 500 空 空
即变化的信息table2,同一个userid取月份最大的那条记录跟table1做个链接,如果一个sql实现呢。还有取没有变化的userid的话
是直接 select * from table1 where userid not in (select userid from table2) 吧。
解决方案 »
- 英文?变成中文?了
- 求一个字符串归并的sql写法
- 这个Sql语句怎么写?
- oracle10 数据库启动不了求助
- [求助]oracle9i 的按小时统计的问题
- 新手请教:如何close cursor, 用sqlj写的程序!!在线等
- update 问题
- 各位大虾,那里有Oracle Spatial下载啊?
- select seq_aa.nextval from dual;我在jdbc里如何把该直取回并变成long型?
- 高分请教,如何测试触发器是否正确!(急急急。。。。。。)
- 2条分页,求差别,结果不一样,rownum注意什么地方
- 我把ora11.2的UNDOTBS01.DBF给删了,怎么恢复呢?急!
select
*
from table1 as a
left join table2 as b on a.UserID=b.UserID and not exists(select 1 from table2 where UserID=b.UserID and yearmonth>b.yearmont)
改改,少打了一个字母方法1select
*
from table1 as a
left join table2 as b on a.UserID=b.UserID and not exists(select 1 from table2 where UserID=b.UserID and yearmonth>b.yearmonth)
方法2select
*
from table1 as a
left join table2 as b on a.UserID=b.UserID and yearmonth= (select MAX(yearmonth) from table2 where UserID=b.UserID )
from table1 m left join table2 n
on m.userId = n.userId and n.yearmonth = (select max(yearmonth) from table1 t where t.userId = n.userId)select m.userid , m.basemomeny , n.yearmonth , n.momeny
from table1 m left join table2 n
on m.userId = n.userId and not exists (select 1 from table1 t where t.userId = n.userId and t.yearmonth > n.yearmonth)
from table1 m left join table2 n
on m.userId = n.userId and n.yearmonth = (select max(yearmonth) from table1 t where t.userId = n.userId)select m.userid , m.basemomeny , n.yearmonth , n.momeny
from table1 m left join table2 n
on m.userId = n.userId and not exists (select 1 from table1 t where t.userId = n.userId and t.yearmonth > n.yearmonth)select m.userid , m.basemomeny , n.yearmonth , n.momeny
from table1 m left join
(
select t.* , row_number() over(partition by userId order by yearmonth desc) px from table2 t
) n
on m.userid = n.userid and n.px = 1
insert into test_table1 values(1,100);
insert into test_table1 values(2,200);
insert into test_table1 values(3,500);create table test_table2(id number(11) not null,userid number(11) not null,yearmonth varchar2(255) not null, momeny varchar2(255) null );insert into test_table2 values(1,1,201108,200);
insert into test_table2 values(2,1,201109,500);
insert into test_table2 values(3,2,201107,700);
insert into test_table2 values(4,2,201109,800);select
*
from test_table1 a
left join test_table2 b on a.UserID=b.UserID and yearmonth= (select MAX(yearmonth) from test_table2 where UserID=b.UserID )ORA-01799: a column may not be outer-joined to a subquery
select
*
from test_table1 a
left join test_table2 b on a.UserID=b.UserID and b.yearmonth= (select MAX(c.yearmonth) from test_table2 as c where c.UserID=b.UserID )加个别名试试
*
from test_table1 a
left join test_table2 b on a.userid=b.userid and not exists(select 1 from test_table2 where userid=b.userid and yearmonth>b.yearmonth)这个可以
改为这样select *
from
test_table1 a
left join
(select b.*
from
(select UserID,MAX(yearmonth) as yearmonth from test_table2 group by UserID)c
inner join test_table2 b on c.UserID=b.UserID and b.yearmonth=c.yearmonth
) b on a.UserID=b.UserID
select m.userid , m.momeny , n.yearmonth , n.momeny
from test_table1 m left join test_table2 n
on m.userId = n.userId and n.yearmonth = (select max(yearmonth) from test_table2 t where t.userId = n.userId)
/* USERID MOMENY YEARMO MOMENY
---------- ---------- ------ ----------
1 100 201109 500
2 200 201109 800
3 500 3 rows selected.
*/select m.userid , m.momeny , n.yearmonth , n.momeny
from test_table1 m left join test_table2 n
on m.userId = n.userId and not exists (select 1 from test_table2 t where t.userId = n.userId and t.yearmonth > n.yearmonth)
/* USERID MOMENY YEARMO MOMENY
---------- ---------- ------ ----------
1 100 201109 500
2 200 201109 800
3 500 3 rows selected.
*/select m.userid , m.momeny , n.yearmonth , n.momeny
from test_table1 m left join
(
select t.* , row_number() over(partition by userId order by yearmonth desc) px from test_table2 t
) n
on m.userid = n.userid and n.px = 1/* USERID MOMENY YEARMO MOMENY
---------- ---------- ------ ----------
1 100 201109 500
2 200 201109 800
3 500 3 rows selected.
*/
select m.userid , m.momeny , n.yearmonth , n.momeny
from test_table1 m left join test_table2 n
on m.userId = n.userId and n.yearmonth = (select max(yearmonth) from test_table2 t where t.userId = n.userId)select m.userid , m.momeny , n.yearmonth , n.momeny
from test_table1 m left join test_table2 n
on m.userId = n.userId and not exists (select 1 from test_table2 t where t.userId = n.userId and t.yearmonth > n.yearmonth)select m.userid , m.momeny , n.yearmonth , n.momeny
from test_table1 m left join
(
select t.* , row_number() over(partition by userId order by yearmonth desc) px from test_table2 t
) n
on m.userid = n.userid and n.px = 1create table test_table1(userid number(11) not null, momeny int null );insert into test_table1 values(1,100);insert into test_table1 values(2,200);insert into test_table1 values(3,500);create table test_table2(id number(11) not null,userid number(11) not null,yearmonth varchar2(6) not null, momeny int null );insert into test_table2 values(1,1,201108,200);insert into test_table2 values(2,1,201109,500);insert into test_table2 values(3,2,201107,700);insert into test_table2 values(4,2,201109,800);insert into test_table2 values(5,2,201110,750);select m.userid , m.momeny , n.yearmonth , n.momeny
from test_table1 m left join test_table2 n
on m.userId = n.userId and n.yearmonth = (select max(yearmonth) from test_table2 t where t.userId = n.userId)
/*
USERID MOMENY YEARMO MOMENY
---------- ---------- ------ ----------
1 100 201109 500
2 200 201110 750
3 500 3 rows selected.
*/select m.userid , m.momeny , n.yearmonth , n.momeny
from test_table1 m left join test_table2 n
on m.userId = n.userId and not exists (select 1 from test_table2 t where t.userId = n.userId and t.yearmonth > n.yearmonth)
/*
USERID MOMENY YEARMO MOMENY
---------- ---------- ------ ----------
1 100 201109 500
2 200 201110 750
3 500 3 rows selected.
*/select m.userid , m.momeny , n.yearmonth , n.momeny
from test_table1 m left join
(
select t.* , row_number() over(partition by userId order by yearmonth desc) px from test_table2 t
) n
on m.userid = n.userid and n.px = 1/*
USERID MOMENY YEARMO MOMENY
---------- ---------- ------ ----------
1 100 201109 500
2 200 201110 750
3 500 3 rows selected.
*/
SQL> create table test_table1(userid number(11) not null, momeny varchar2(255) null );
Table created
SQL> insert into test_table1 values(1,100);
1 row inserted
SQL> insert into test_table1 values(2,200);
1 row inserted
SQL> insert into test_table1 values(3,500);
1 row inserted
SQL> create table test_table2(id number(11) not null,userid number(11) not null,yearmonth varchar2(255) not null, momeny varchar2(255) null );
Table created
SQL> insert into test_table2 values(1,1,201108,200);
1 row inserted
SQL> insert into test_table2 values(2,1,201109,500);
1 row inserted
SQL> insert into test_table2 values(3,2,201107,700);
1 row inserted
SQL> insert into test_table2 values(4,2,201109,800);
1 row inserted
SQL>
SQL> select m.userid , m.momeny , n.yearmonth , n.momeny
2 from test_table1 m left join test_table2 n
3 on m.userId = n.userId and n.yearmonth = (select max(yearmonth) from test_table2 t where t.userId = n.userId)
4 /
select m.userid , m.momeny , n.yearmonth , n.momeny
from test_table1 m left join test_table2 n
on m.userId = n.userId and n.yearmonth = (select max(yearmonth) from test_table2 t where t.userId = n.userId)
ORA-01799: 列は副問合せに対して外部結合されません。
SQL>
SQL> select m.userid , m.momeny , n.yearmonth , n.momeny
2 from test_table1 m left join test_table2 n
3 on m.userId = n.userId and n.yearmonth = (select max(yearmonth) from test_table2 t where t.userId = n.userId)
4 ;
select m.userid , m.momeny , n.yearmonth , n.momeny
from test_table1 m left join test_table2 n
on m.userId = n.userId and n.yearmonth = (select max(yearmonth) from test_table2 t where t.userId = n.userId)
ORA-01799: 列は副問合せに対して外部結合されません。