急急急急急急急急急急急急急急急急!!!

gz5182009 2012-03-23 09:11:45
我现在有两张表

课程表
id 课程名称 报名人员
1 NET 790,780,417
2 c++培训 790,417,780
3 c培训 417,790,962,
分享表
课程id 工号 主题 心得
1 790 66666666 666666666
2 790 学习心得 这个课程真好
3 790 ff bucuo
我想得到的结果
课程id 工号
1 780
2 780
3 780
1 417
2 417
3 417
3 962

我现在想找到谁没有分享,请教高手指点
...全文
91 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 gz5182009 的回复:]
我想得到的结果
课程id 工号
1 780
2 780
3 780
1 417
2 417
3 417
3 962
[/Quote]
楼主想要的"3 780"有问题,
课程表里id=3的人员里没有780:
"3 c培训 417,790,962,"
gw6328 2012-03-23
  • 打赏
  • 举报
回复

我来个折分的版本吧 我以id和v做课程号与工号
select w.id,b.x from ( select a.id,u=cast('<root><v>'+replace(a.v,',','</v><v>')+'</v></root>' as xml) from @t a) w outer apply (select x=N.v.value('.','varchar(10)') from w.u.nodes('/root/v') N(v)) b
except (select id,v from @t1)
唐诗三百首 2012-03-23
  • 打赏
  • 举报
回复

create table 课程表
(id int, 课程名称 varchar(8), 报名人员 varchar(20))

insert into 课程表
select 1, 'NET', '790,780,417' union all
select 2, 'c++培训', '790,417,780' union all
select 3, 'c培训', '417,790,962'

create table 分享表
(课程id int, 工号 int, 主题 varchar(10), 心得 varchar(20))

insert into 分享表
select 1, 790, '66666666', '666666666' union all
select 2, 790, '学习心得', '这个课程真好' union all
select 3, 790, 'ff', 'bucuo'


select c.id '课程id',c.工号
from
(select a.id,
substring(a.报名人员,b.number,charindex(',',a.报名人员+',',b.number)-b.number) '工号'
from 课程表 a
inner join master.dbo.spt_values b
on b.[type]='P' and substring(','+a.报名人员,b.number,1)=',') c
left join
(select 课程id,工号 from 分享表) d
on c.id=d.课程id and c.工号=d.工号
where d.课程id is null and d.工号 is null


课程id 工号
----------- --------------------
1 780
1 417
2 417
2 780
3 417
3 962

(6 row(s) affected)
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 haiwer 的回复:]

看4楼,设计问题后患无穷,晚改不如早改

就算有些高手在你现有设计也能写出查询语句来(很有技巧而且看起来功能完全实现),至少性能是存在问题的,以后优化的人会骂的
[/Quote]

这才是大牛,拜膜一个
昵称被占用了 2012-03-23
  • 打赏
  • 举报
回复
看4楼,设计问题后患无穷,晚改不如早改

就算有些高手在你现有设计也能写出查询语句来(很有技巧而且看起来功能完全实现),至少性能是存在问题的,以后优化的人会骂的
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 haiwer 的回复:]

课程表去掉报名人员字段
增加报名人员表:课程ID、工号

查询那就方便了
SQL code
SELECT A.*
FROM 报名人员表 A
LEFT JOIN 分享表 B
ON A.课程ID=B.课程ID
AND A.工号=B.工号
WHERE B.课程ID IS NULL
[/Quote]
++,你的设计确实比较不合适
gz5182009 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 haiwer 的回复:]

课程表去掉报名人员字段
增加报名人员表:课程ID、工号

查询那就方便了
SQL code
SELECT A.*
FROM 报名人员表 A
LEFT JOIN 分享表 B
ON A.课程ID=B.课程ID
AND A.工号=B.工号
WHERE B.课程ID IS NULL
[/Quote]
这样倒是可以不过改动工作量挺大,我一开始说的那样可以取出来么?
昵称被占用了 2012-03-23
  • 打赏
  • 举报
回复
你这个报名人员字段时可分的,不符合第一范式规范,理论上就会存在问题,数据更新、数据查询都会有问题
昵称被占用了 2012-03-23
  • 打赏
  • 举报
回复
课程表去掉报名人员字段
增加报名人员表:课程ID、工号

查询那就方便了
SELECT A.*
FROM 报名人员表 A
LEFT JOIN 分享表 B
ON A.课程ID=B.课程ID
AND A.工号=B.工号
WHERE B.课程ID IS NULL
gz5182009 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 haiwer 的回复:]

课程表设计有问题
[/Quote]
请指点
昵称被占用了 2012-03-23
  • 打赏
  • 举报
回复
课程表设计有问题

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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