查看: 8010|回复: 37

【讨论】求一个算法

[复制链接]
论坛徽章:
5
2008新春纪念徽章
日期:2008-02-13 12:43:03祖国60周年纪念徽章
日期:2009-10-09 08:28:002014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02优秀写手
日期:2014-10-10 06:00:03
发表于 2014-10-6 14:57 | 显示全部楼层 |阅读模式
表1,为如下字段,与内容


列1 列2 列3 列4
ptd1  A1  B1  C1
ptd1  A2  B2  C2
ptd1  A2  B3  C3       ----> ptd1相同
      
ptd2  A1  B1  C1
ptd2  A2  B2  C2
ptd2  A3  B3  C3
ptd2  A5  B5  C5       ----> ptd2相同
      
ptd3  A1  B1  C1
ptd3  A2  B2  C2
ptd3  A3  B3  C3       ----> ptd3相同



表2,为如下字段与内容


列1         列2        列3        列4
com1         A1        B1        C1
com1         A2        B2        C2
com1         A3        B3        C3
com1         A4        B4        C4


-----------------------------------------------------------
现在的要求是,用表1去匹配表2,
  比较的字段是,表1的列2 = 表2的列2
                      表1的列3 = 表2的列3
                      表1的列4 = 表2的列4

匹配要求如下:

列1 列2 列3 列4
ptd1  A1  B1  C1
ptd1  A2  B2  C2
ptd1  A2  B3  C3      -〉 A2在表2中不符合
      
ptd2  A1  B1  C1
ptd2  A2  B2  C2
ptd2  A3  B3  C3
ptd2  A5  B5  C5      -〉 A5,B5,C5在表2中不符合
      
ptd3  A1  B1  C1
ptd3  A2  B2  C2
ptd3  A3  B3  C3      -〉符合(抽出的时候,只要ptd3 ,com1)


问题的简单描述是,表1如果有record的话,所有的列2,列3,列4,必须在表2里面有。
但是反过来,表2里面的record,不一定,要在表1存在。


因为数据比较多,匹配起来,速度很慢,我测试,大概1000条数据,就用了我快10分钟。
希望,有人能帮我看看,有没有好的算法。


感激不尽。





论坛徽章:
5
2008新春纪念徽章
日期:2008-02-13 12:43:03祖国60周年纪念徽章
日期:2009-10-09 08:28:002014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02优秀写手
日期:2014-10-10 06:00:03
 楼主| 发表于 2014-10-6 15:20 | 显示全部楼层
本帖最后由 六安瓜片 于 2014-10-6 15:21 编辑

create table tab1(col1 varchar2(256),col2 varchar2(256),col3 varchar2(256),col4 varchar2(256));
create table tab2(col1 varchar2(256),col2 varchar2(256),col3 varchar2(256),col4 varchar2(256));


insert into tab1  values('ptd1','A1','B1','C1');
insert into tab1  values('ptd1','A2','B2','C2');
insert into tab1  values('ptd1','A2','B3','C3');

insert into tab1  values('ptd2','A1','B1','C1');
insert into tab1  values('ptd2','A2','B2','C2');
insert into tab1  values('ptd2','A3','B3','C3');
insert into tab1  values('ptd2','A5','B5','C5');

insert into tab1  values('ptd3','A1','B1','C1');
insert into tab1  values('ptd3','A2','B2','C2');
insert into tab1  values('ptd3','A3','B3','C3');

insert into tab2  values('com1','A1','B1','C1');
insert into tab2  values('com1','A2','B2','C2');
insert into tab2  values('com1','A3','B3','C3');
insert into tab2  values('com1','A4','B4','C4');


select * from tab1;
/
select * from tab2;
/


使用道具 举报

回复
论坛徽章:
403
紫蛋头
日期: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
发表于 2014-10-6 15:56 | 显示全部楼层
要求结果是什么?

使用道具 举报

回复
招聘 : 系统分析师
论坛徽章:
483
马上有钱
日期:2014-02-19 11:55:14itpub13周年纪念徽章
日期:2014-09-29 01:14:14itpub13周年纪念徽章
日期:2014-10-08 15:15:25itpub13周年纪念徽章
日期:2014-10-08 15:15:25马上有对象
日期:2014-10-12 11:58:40马上有车
日期:2014-11-16 17:11:29慢羊羊
日期:2015-02-09 17:04:38沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31ITPUB年度最佳版主
日期:2015-03-18 15:48:48
发表于 2014-10-6 16:14 | 显示全部楼层
left join就可以吧,where t2.com1 is null 就可以筛选出来了

使用道具 举报

回复
招聘 : 系统分析师
论坛徽章:
483
马上有钱
日期:2014-02-19 11:55:14itpub13周年纪念徽章
日期:2014-09-29 01:14:14itpub13周年纪念徽章
日期:2014-10-08 15:15:25itpub13周年纪念徽章
日期:2014-10-08 15:15:25马上有对象
日期:2014-10-12 11:58:40马上有车
日期:2014-11-16 17:11:29慢羊羊
日期:2015-02-09 17:04:38沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31ITPUB年度最佳版主
日期:2015-03-18 15:48:48
发表于 2014-10-6 16:19 | 显示全部楼层
select t1.* from t1 left join t2 on t1.col2=t2..col2 and t1.col3=t2.col3 and t4.col4=t2.col4 where t2.col1 is null
/

这样就能挑出不合格的t1中的内容

使用道具 举报

回复
论坛徽章:
403
紫蛋头
日期: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
发表于 2014-10-6 20:46 | 显示全部楼层
lastwinner 发表于 2014-10-6 16:19
select t1.* from t1 left join t2 on t1.col2=t2..col2 and t1.col3=t2.col3 and t4.col4=t2.col4 where t ...

(t1.col1,t1.col2,t1,col3) not in(t2.col1,t2.col2,t2.col3)
and
(t1.col2,t1.col3)  in(t2.col2,t2.col3)

使用道具 举报

回复
论坛徽章:
18
奥迪
日期:2014-01-23 17:13:08喜羊羊
日期:2015-05-29 07:20:492015年新春福章
日期:2015-03-06 11:59:472015年新春福章
日期:2015-03-04 14:55:13马上加薪
日期:2014-10-22 11:08:29itpub13周年纪念徽章
日期:2014-10-10 07:09:53生肖徽章:蛇
日期:2014-06-19 17:10:12生肖徽章:龙
日期:2014-06-19 17:10:12 2014年世界杯参赛球队: 德国
日期:2014-06-13 10:14:37优秀写手
日期:2014-05-14 06:00:20
发表于 2014-10-6 21:14 | 显示全部楼层
本帖最后由 YuBinTAMU 于 2014-10-6 08:23 编辑

Not sure which result is request, so put both of them here:

====all records which satisfy the rules====

SQL>select t1.col1, t2.col1
  2  from tab1 t1
  3  inner join tab2 t2
  4  using ( col2, col3, col4);

COL1   COL1
------ ------
ptd1   com1
ptd1   com1
ptd2   com1
ptd2   com1
ptd2   com1
ptd3   com1
ptd3   com1
ptd3   com1

8 rows selected.

====all records in tab1 which NOT satisfy the rules====
SQL> select t1.col1, col2, col3, col4
  2  from tab1 t1
  3  left join tab2 t2
  4  using ( col2, col3, col4)
  5 where t2.col1 is null;

COL1   COL2   COL3   COL4
------ ------ ------ ------
ptd2   A5     B5     C5
ptd1   A2     B3     C3

2 rows selected.




使用道具 举报

回复
论坛徽章:
18
奥迪
日期:2014-01-23 17:13:08喜羊羊
日期:2015-05-29 07:20:492015年新春福章
日期:2015-03-06 11:59:472015年新春福章
日期:2015-03-04 14:55:13马上加薪
日期:2014-10-22 11:08:29itpub13周年纪念徽章
日期:2014-10-10 07:09:53生肖徽章:蛇
日期:2014-06-19 17:10:12生肖徽章:龙
日期:2014-06-19 17:10:12 2014年世界杯参赛球队: 德国
日期:2014-06-13 10:14:37优秀写手
日期:2014-05-14 06:00:20
发表于 2014-10-6 21:19 | 显示全部楼层
"问题的简单描述是,表1如果有record的话,所有的列2,列3,列4,必须在表2里面有。
但是反过来,表2里面的record,不一定,要在表1存在。"

It's typical scenario for a Foreign key constraint, so try to apply it on your table if you can, instead of self-coding for the logic.

Plus, if the efficency is the proble, check the indexes on both tables. or, paste your execution plan here so we can help upon it.

使用道具 举报

回复
论坛徽章:
526
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2014-10-6 21:34 | 显示全部楼层
因为不知道楼主要输出什么,只好猜测:
SELECT tab1.col1
  FROM tab1 PARTITION BY (tab1.col1)
       LEFT JOIN tab2 ON tab1.col2=tab2.col2 AND tab1.col3=tab2.col3 AND tab1.col4=tab2.col4
GROUP BY tab1.col1
HAVING COUNT(*)=COUNT(tab2.col2)  

使用道具 举报

回复
认证徽章
论坛徽章:
169
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL极客
日期:2013-12-09 14:13:35SQL大赛参与纪念
日期:2013-12-06 14:03:45最佳人气徽章
日期:2015-03-19 09:44:03现任管理团队成员
日期:2015-08-26 02:10:00秀才
日期:2015-07-28 09:12:12举人
日期:2015-07-13 15:30:15进士
日期:2015-07-28 09:12:58探花
日期:2015-07-28 09:12:58榜眼
日期:2015-08-18 09:48:03
发表于 2014-10-6 22:56 | 显示全部楼层
newkid 发表于 2014-10-6 21:34
因为不知道楼主要输出什么,只好猜测:
SELECT tab1.col1
  FROM tab1 PARTITION BY (tab1.col1)

看了回复明白了楼主的意思。。

使用道具 举报

回复

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

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时9.5折

【架构革新 高效可控】2020年8月17日~19日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


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