17,377
社区成员
发帖
与我相关
我的任务
分享
SQL>
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: 列は副問合せに対して外部結合されません。
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 = 1
create 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.
*/
create 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);
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 *
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
*
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 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 )
select m.userid , m.basemomeny , n.yearmonth , n.momeny
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
select m.userid , m.basemomeny , n.yearmonth , n.momeny
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)
方法1
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.yearmonth)
方法2
select
*
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 )
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)