楼主: arron刘

【每周一议】干货讨论 如何合并两个查询的结果集的数据

[复制链接]
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
21#
发表于 2012-11-7 16:54 | 只看该作者
grantguan 发表于 2012-11-7 15:40
我来一个SQL Server 2012 的:

oracle也能这么干

使用道具 举报

回复
论坛徽章:
12
奥运会纪念徽章:马术
日期:2012-08-14 18:12:40ITPUB社区12周年站庆徽章
日期:2013-09-13 11:28:50ITPUB社区千里马徽章
日期:2013-08-22 09:58:03紫蛋头
日期:2013-01-10 11:05:26咸鸭蛋
日期:2013-01-04 10:58:46复活蛋
日期:2012-12-11 16:53:14ITPUB 11周年纪念徽章
日期:2012-10-31 14:48:00奥运会纪念徽章:体操
日期:2012-08-14 18:13:12奥运会纪念徽章:自行车
日期:2012-08-14 18:13:04奥运会纪念徽章:羽毛球
日期:2012-08-14 18:13:04
22#
发表于 2012-11-7 17:09 | 只看该作者
SELECT MyDate , nvl(A.ID, 0) , nvl(B.ID, 0)
FROM A FULL OUTER JOIN B
USING (MyDate);

使用道具 举报

回复
xiaoyao1107 该用户已被删除
23#
发表于 2012-11-8 01:52 | 只看该作者
要考虑3种情况:
1.A表有的日期,B表无
2.A表无的日期,A表有
3.A表有的日期,B表也有

只要符合这3种情况,写出来的sql都无啥问题。注意把null补成0.

使用道具 举报

回复
论坛徽章:
1
2013年新春福章
日期:2013-02-25 14:51:24
24#
发表于 2012-11-8 10:58 | 只看该作者
LuiseDalian 发表于 2012-11-7 10:25
oracle 11g下实测

就3楼兄弟的表结构,提供mysql 版本笨方法2个:
法1:
SELECT tmp.newdate,SUM(IF(tmp.flag=1,tmp.newid,0)),SUM(IF(tmp.flag=2,tmp.newid,0))
FROM(
SELECT A.mydate AS newdate,A.id AS newid,1 AS flag FROM A
UNION ALL
SELECT B.mydate AS newdate,B.id AS newid,2 AS flag FROM B
) as tmp
GROUP BY tmp.newdate;

法2:
SELECT A.mydate,A.id,IF(B.id is NULL ,0,B.id )
FROM A LEFT  JOIN B ON A.mydate=B.mydate
UNION
SELECT B.mydate,IF(A.id is NULL ,0,A.id ),B.id
FROM B LEFT  JOIN A ON A.mydate=B.mydate
;

使用道具 举报

回复
论坛徽章:
0
25#
发表于 2012-11-8 12:48 | 只看该作者
很好的。学习~

使用道具 举报

回复
论坛徽章:
0
26#
发表于 2012-11-8 16:14 | 只看该作者
ORACLE 10G

CREATE TABLE tab_new
(new_no NUMBER,
new_date VARCHAR2(20));

CREATE TABLE tab_old
(old_no NUMBER,
old_date VARCHAR2(20));

INSERT INTO tab_new VALUES(1,'20121101');
INSERT INTO tab_new VALUES(2,'20121102');
INSERT INTO tab_new VALUES(3,'20121105');
COMMIT;
INSERT INTO tab_old VALUES(5,'20121101');
INSERT INTO tab_old VALUES(6,'20121102');
COMMIT;

SELECT NEW_DATE, NEW_NO, NVL(OLD_NO, 0)
  FROM TAB_NEW A
  FULL JOIN TAB_OLD B
    ON A.NEW_DATE = B.OLD_DATE;

           NEW_DATE        NEW_NO        NVL(OLD_NO,0)
1        20121101                       1         5
2        20121102                       2             6
3        20121105                       3        0

使用道具 举报

回复
论坛徽章:
1
ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:48
27#
发表于 2012-11-8 16:36 | 只看该作者
select a.date as 日期,a.id as 新用户,nvl(b.id,0) as 老用户 from a left join b on a.date=b.date

使用道具 举报

回复
论坛徽章:
0
28#
发表于 2012-11-8 17:11 | 只看该作者
ORACLE 9i 调试通过。

create table TEMP1
(
  RDATA DATE,
  RUSER VARCHAR2(10)
);
create table TEMP2
(
  RDATA DATE,
  RUSER VARCHAR2(10)
);


insert into TEMP1 (RDATA, RUSER)
values (to_date('05-11-2012', 'dd-mm-yyyy'), 'NEW');
insert into TEMP1 (RDATA, RUSER)
values (to_date('02-11-2012', 'dd-mm-yyyy'), 'NEW');
insert into TEMP1 (RDATA, RUSER)
values (to_date('02-11-2012', 'dd-mm-yyyy'), 'NEW');
insert into TEMP1 (RDATA, RUSER)
values (to_date('02-11-2012', 'dd-mm-yyyy'), 'NEW');
insert into TEMP1 (RDATA, RUSER)
values (to_date('01-11-2012', 'dd-mm-yyyy'), 'NEW');
insert into TEMP1 (RDATA, RUSER)
values (to_date('05-11-2012', 'dd-mm-yyyy'), 'NEW');
insert into TEMP1 (RDATA, RUSER)
values (to_date('05-11-2012', 'dd-mm-yyyy'), 'NEW');
insert into TEMP1 (RDATA, RUSER)
values (to_date('05-11-2012', 'dd-mm-yyyy'), 'NEW');
insert into TEMP1 (RDATA, RUSER)
values (to_date('05-11-2012', 'dd-mm-yyyy'), 'NEW');
insert into TEMP1 (RDATA, RUSER)
values (to_date('05-11-2012', 'dd-mm-yyyy'), 'NEW');
insert into TEMP1 (RDATA, RUSER)
values (to_date('05-11-2012', 'dd-mm-yyyy'), 'NEW');
insert into TEMP1 (RDATA, RUSER)
values (to_date('05-11-2012', 'dd-mm-yyyy'), 'NEW');
commit;

insert into TEMP2 (RDATA, RUSER)
values (to_date('01-11-2012', 'dd-mm-yyyy'), 'OLD');
insert into TEMP2 (RDATA, RUSER)
values (to_date('01-11-2012', 'dd-mm-yyyy'), 'OLD');
insert into TEMP2 (RDATA, RUSER)
values (to_date('01-11-2012', 'dd-mm-yyyy'), 'OLD');
insert into TEMP2 (RDATA, RUSER)
values (to_date('01-11-2012', 'dd-mm-yyyy'), 'OLD');
insert into TEMP2 (RDATA, RUSER)
values (to_date('01-11-2012', 'dd-mm-yyyy'), 'OLD');
insert into TEMP2 (RDATA, RUSER)
values (to_date('02-11-2012', 'dd-mm-yyyy'), 'OLD');
insert into TEMP2 (RDATA, RUSER)
values (to_date('02-11-2012', 'dd-mm-yyyy'), 'OLD');
insert into TEMP2 (RDATA, RUSER)
values (to_date('02-11-2012', 'dd-mm-yyyy'), 'OLD');
commit;

SQL> select  new,a.rdata,b.rdata  from
  2  (select rdata as new,count(*)rdata from temp1 group by rdata ) a,
  3  (select rdata as old,count(*)rdata from temp2 group by rdata ) b
  4  where   a.new=b.old(+)
  5  ;

NEW              RDATA      RDATA
----------- ---------- ----------
2012-11-1            1          5
2012-11-2            3          3
2012-11-5            8

使用道具 举报

回复
论坛徽章:
9
蛋疼蛋
日期:2011-10-18 11:00:17ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51蜘蛛蛋
日期:2011-11-09 13:48:06迷宫蛋
日期:2011-11-24 10:38:342012新春纪念徽章
日期:2012-01-04 11:56:44蜘蛛蛋
日期:2013-07-12 21:52:36凯迪拉克
日期:2013-12-12 09:53:072014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08
29#
发表于 2012-11-9 13:27 | 只看该作者
〇〇 发表于 2012-11-7 13:04
join oldUser a on a.dt=b.dt  where b.dt is null;
没有outer是什么含义?

就是语法里面不支持 a full out join b 这样的语句

使用道具 举报

回复
论坛徽章:
9
蛋疼蛋
日期:2011-10-18 11:00:17ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51蜘蛛蛋
日期:2011-11-09 13:48:06迷宫蛋
日期:2011-11-24 10:38:342012新春纪念徽章
日期:2012-01-04 11:56:44蜘蛛蛋
日期:2013-07-12 21:52:36凯迪拉克
日期:2013-12-12 09:53:072014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08
30#
发表于 2012-11-9 13:29 | 只看该作者
〇〇 发表于 2012-11-7 15:22
本来想写通用一些,结果mysql还没有nvl

恩 有if ifnull函数代替 mysql中decode也跟oracle 不一样

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表