这个SQL极难,绝对需要高手!!

APOLLO_TS 2009-05-11 06:29:30
CREATE TABLE IF NOT EXISTS T_ACC_ROLE (
ACC_ROLE_ID INT(11) NOT NULL AUTO_INCREMENT COMMENT '编号ID',
ROLE_ID int(4) NOT NULL COMMENT '角色ID',
PRIORITY int(4) default NULL COMMENT '优先权',
INFO int(4) default NULL COMMENT '信息',
PRIMARY KEY(ACC_ROLE_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS T_ACC_ROLE_NOR (
ACC_ROLE_ID INT(11) NOT NULL AUTO_INCREMENT COMMENT '编号ID',
ROLE_ID int(4) NOT NULL COMMENT '角色ID',
INFO int(4) default NULL COMMENT '信息',
PRIMARY KEY(ACC_ROLE_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

T_ACC_ROLE 数据
ACC_ROLE_ID ROLE_ID PRIORITY INFO
1 2 1 11
2 2 2 12
3 2 3 13
4 4 1 14

T_ACC_ROLE_NOR 数据
ACC_ROLE_ID ROLE_ID INFO
1 2 16
2 3 17
4 5 19

要采集这两个表的INFO,INFO在两个表中不会重复。但是T_ACC_ROLE 中有重复的ROLE_ID,这时候要PRIORITY 较小的信息,说白了是优先级别较高的信息。但是在T_ACC_ROLE_NOR 也有ROLE_ID,那么表T_ACC_ROLE_NOR 中的信息处于更高的优先级,那么就采用T_ACC_ROLE_NOR的信息。

算法过程:

例如:搜索表T_ACC_ROLE
有三个ROLE_ID=2的信息,取PRIORITY =1的信息。
但是在T_ACC_ROLE_NOR表中也有ROLE_ID=2的信息,那么T_ACC_ROLE 表的信息就是旧信息,不采用,使用T_ACC_ROLE_NOR 的信息。

最后结果是:

ROLE_ID INFO
2 16
3 17
4 14
5 19
...全文
396 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
hofstede 2009-05-13
  • 打赏
  • 举报
回复
学习
manbu3269 2009-05-13
  • 打赏
  • 举报
回复
SELECT t.role_id, t.info
FROM (
SELECT m.role_id, m.priority, m.info
FROM (
SELECT r.role_id as role_id, r.priority as priority, r.info as info
FROM t_acc_role r
UNION
SELECT n.role_id, -1, n.info
FROM t_acc_role_nor n
) m
ORDER BY m.role_id, m.priority
) t
GROUP BY t.role_id;
ET郭强 2009-05-12
  • 打赏
  • 举报
回复
支持W~~~~~
sun85222 2009-05-12
  • 打赏
  • 举报
回复
难个球,只是复杂点。有是一个标题党
KingZChina 2009-05-12
  • 打赏
  • 举报
回复
又学到了
  • 打赏
  • 举报
回复
学习下拉
summily 2009-05-12
  • 打赏
  • 举报
回复
看着都难
tg008007x3 2009-05-12
  • 打赏
  • 举报
回复
太简单
lxc_fxn 2009-05-12
  • 打赏
  • 举报
回复
学习了
jinxfei 2009-05-12
  • 打赏
  • 举报
回复
结贴啊,我们好帮你继续看。
2000ihby 2009-05-12
  • 打赏
  • 举报
回复
3楼正解
APOLLO_TS 2009-05-12
  • 打赏
  • 举报
回复
大家请看:

http://topic.csdn.net/u/20090512/16/c0642219-6c81-407e-bfc9-f7902341dc65.html
APOLLO_TS 2009-05-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sun85222 的回复:]
难个球,只是复杂点。有是一个标题党
[/Quote]

我把表结构简化了,其实INFO来源一个表。 而且也不叫INFO,业务点实在太多,说的费劲,一会在发一贴,麻烦给看看!
myairland 2009-05-11
  • 打赏
  • 举报
回复
就是一个现状表,一个履历表嘛......
kingssman 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jinxfei 的回复:]
小菜一碟:


SQL codeselect role_id, info
from t_acc_role a
where a.priority=(select max(priority) from t_acc_role b where b.role_id=a.role_id)
and a.role_id not in (select role_id from t_acc_role_nor)
union
select role_id,info
from t_acc_role_nor
order by role_id
[/Quote]

呵呵,标题党
fredy1111 2009-05-11
  • 打赏
  • 举报
回复
哦,distinct不用了,如果两个记录role_id一样priority也一样info也不一样,distinct也没用,就都选出来好了。
xnjnmn 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jinxfei 的回复:]
小菜一碟:


SQL codeselect role_id, info
from t_acc_role a
where a.priority=(select min(priority) from t_acc_role b where b.role_id=a.role_id)
and a.role_id not in (select role_id from t_acc_role_nor)
union
select role_id,info
from t_acc_role_nor
order by role_id
[/Quote]
顶下
kao 100分没了

fredy1111 2009-05-11
  • 打赏
  • 举报
回复
难度还行啦,我稍微想想也能写出来,1楼的order by 我一开始还觉得不对劲,看了解释才明白。
3楼的我觉得max(priority)应该改成min(priority),第一行再加一个distinct
jinxfei 2009-05-11
  • 打赏
  • 举报
回复
小菜一碟:

select role_id, info
from t_acc_role a
where a.priority=(select max(priority) from t_acc_role b where b.role_id=a.role_id)
and a.role_id not in (select role_id from t_acc_role_nor)
union
select role_id,info
from t_acc_role_nor
order by role_id
  • 打赏
  • 举报
回复
希望楼主以后发帖子,不要采用这种标题

这种标题起不到让人驻足观看的作用,反而会让人反感!
加载更多回复(1)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧