例如我有两个表:
表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语句应该如何写?
6 个解决方案
#1
可以試一下下面的sql
使用charindex()也可以實現
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()也可以實現
#2
相当感谢~~~仔细研究一下
#3
运行是上面的结果....
我只是想列出没有参加过任何会议的人的名单,这个结果不太对...
#4
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)+'|%')
(select DISTINCT B.PID from meeting as a ,personal as b
where a.pidlist like '%|'+cast(b.pid as varchar)+'|%')
#5
照抄楼上的DDL.
另外建议不要这样保存pidlist,这样不仅无法使用索引,对于更的需求会造成更大的不变。 使用多对多的关系保存人员和会议,这种pidlist只需要在做报表时呈现就可以了。
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只需要在做报表时呈现就可以了。
#6
这个很好~~
#1
可以試一下下面的sql
使用charindex()也可以實現
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()也可以實現
#2
相当感谢~~~仔细研究一下
#3
运行是上面的结果....
我只是想列出没有参加过任何会议的人的名单,这个结果不太对...
#4
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)+'|%')
(select DISTINCT B.PID from meeting as a ,personal as b
where a.pidlist like '%|'+cast(b.pid as varchar)+'|%')
#5
照抄楼上的DDL.
另外建议不要这样保存pidlist,这样不仅无法使用索引,对于更的需求会造成更大的不变。 使用多对多的关系保存人员和会议,这种pidlist只需要在做报表时呈现就可以了。
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只需要在做报表时呈现就可以了。
#6
这个很好~~