如何判断表中字段是否包含另一个字段的值?

流小凯 2015-07-30 03:20:44
各位大神,小弟初学sql想请教一个问题~~先谢谢大家啦~~
例如我有两个表:

表A:personal (人员表)

pid name
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
6 ffff
7 ggg

表B:metting (会议表,pidlist代表参加会议的人员,用“|”分隔)

bid pidlist
1 |2|3|4|
2 |1|3|4|
3 |1|2|4|

我想要 列出表A中没有参加会议的人,sql语句应该如何写?
...全文
5514 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
流小凯 2015-08-04
  • 打赏
  • 举报
回复
这个很好~~
zhll2046 2015-07-30
  • 打赏
  • 举报
回复
照抄楼上的DDL.
create table personal
(
pid int,
name varchar(5)
)
 
create table meeting
(
bid int,
pidlist varchar(20)
)
 
insert personal 
select 1,'aaa' union 
select 2,'bbb' union 
select 3,'ccc' union 
select 4,'ddd' union 
select 5,'eee' union 
select 6,'fff' union 
select 7,'ggg' 
 
insert meeting 
select 1,'|2|3|4|' union
select 2,'|1|3|4|' union 
select 3,'|1|2|4|' 
 

SELECT * FROM personal p WHERE NOT EXISTS(SELECT 1 FROM meeting WHERE CHARINDEX(CAST(p.pid AS VARCHAR(20)),pidlist)>0)

 
另外建议不要这样保存pidlist,这样不仅无法使用索引,对于更的需求会造成更大的不变。 使用多对多的关系保存人员和会议,这种pidlist只需要在做报表时呈现就可以了。
RINK_1 2015-07-30
  • 打赏
  • 举报
回复
SELECT * FROM personal WHERE pid NOT IN (select DISTINCT B.PID from meeting as a ,personal as b where a.pidlist like '%|'+cast(b.pid as varchar)+'|%')
流小凯 2015-07-30
  • 打赏
  • 举报
回复


运行是上面的结果....

我只是想列出没有参加过任何会议的人的名单,这个结果不太对...
流小凯 2015-07-30
  • 打赏
  • 举报
回复
相当感谢~~~仔细研究一下
reenjie 2015-07-30
  • 打赏
  • 举报
回复
可以試一下下面的sql

create table personal
(
pid int,
name varchar(5)
)

create table meeting
(
bid int,
pidlist varchar(20)
)

insert personal 
select 1,'aaa' union 
select 2,'bbb' union 
select 3,'ccc' union 
select 4,'ddd' union 
select 5,'eee' union 
select 6,'fff' union 
select 7,'ggg' 

insert meeting 
select 1,'|2|3|4|' union
select 2,'|1|3|4|' union 
select 3,'|1|2|4|' 

select * from meeting as a ,personal  as b 
where a.pidlist not like '%|'+cast(b.pid as varchar)+'|%'

使用charindex()也可以實現

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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