作者:乐民修德 | 来源:互联网 | 2023-09-25 13:57
星期表
星期编号 星期
1 星期一
2 星期二
3 星期三
4 星期四
5 星期五
6 星期六
7 星期日
值日表
星期编号 值日老师 事件
1 王老师 X
2 李老师
3 王老师 XX
4 黄老师
5 李老师
6 黄老师
7 王老师 XXX
有什么好的方式,可以根据老师查询出他的值日安排?
星期编号 星期 值日老师 事件
1 星期一 王老师 X
2 星期二
3 星期三 王老师 XX
4 星期四
5 星期五
6 星期六
7 星期日 王老师 XXX
12 个解决方案
declare @Tname nvarchar(6)
set @Tname='黄老师' --这里的”黄老师“为要查询的老师姓名
create table 星期表(星期编号 int , 星期 nvarchar(6))
insert into 星期表(星期编号,星期) values(1,'星期一')
insert into 星期表(星期编号,星期) values(2,'星期二')
insert into 星期表(星期编号,星期) values(3,'星期三')
insert into 星期表(星期编号,星期) values(4,'星期四')
insert into 星期表(星期编号,星期) values(5,'星期五')
insert into 星期表(星期编号,星期) values(6,'星期六')
insert into 星期表(星期编号,星期) values(7,'星期日')
create table 值日表(星期编号 int, 值日老师 nvarchar(6), 事件 nvarchar(4))
insert into 值日表(星期编号,值日老师,事件) values(1,'王老师','X')
insert into 值日表(星期编号,值日老师) values(2,'李老师 ')
insert into 值日表(星期编号,值日老师,事件) values(3,'王老师','XX')
insert into 值日表(星期编号,值日老师) values(4,'黄老师')
insert into 值日表(星期编号,值日老师) values(5,'李老师')
insert into 值日表(星期编号,值日老师) values(6,'黄老师')
insert into 值日表(星期编号,值日老师,事件) values(7,'王老师',' XXX')
/*
delete 星期表
delete 值日表
*/
select 星期表.星期编号,星期,值日老师,事件 from 星期表 left outer join (select * from 值日表 where 值日老师=@Tname) as AA on 星期表.星期编号=AA.星期编号
drop table 星期表
drop table 值日表
代码中未对星期表和值日表存在性做检测假装是不存在需要创建并初始化值,如果已经有了可以忽略对应代码。
完善了一下,增加了表存在检查代码,并把null值替换成空白显示,在Sql2005中测试通过
declare @Tname nvarchar(6)
set @Tname='王老师' --这里的”王老师“为要查询的老师姓名,执行时替换成你要查询的老师姓名
if object_id(N'星期表',N'U') is not null
drop table 星期表
if object_id(N'值日表',N'U') is not null
drop table 值日表
create table 星期表(星期编号 int , 星期 nvarchar(6))
insert into 星期表(星期编号,星期) values(1,'星期一')
insert into 星期表(星期编号,星期) values(2,'星期二')
insert into 星期表(星期编号,星期) values(3,'星期三')
insert into 星期表(星期编号,星期) values(4,'星期四')
insert into 星期表(星期编号,星期) values(5,'星期五')
insert into 星期表(星期编号,星期) values(6,'星期六')
insert into 星期表(星期编号,星期) values(7,'星期日')
create table 值日表(星期编号 int, 值日老师 nvarchar(6), 事件 nvarchar(4) default(''))
insert into 值日表(星期编号,值日老师,事件) values(1,'王老师','X')
insert into 值日表(星期编号,值日老师) values(2,'李老师 ')
insert into 值日表(星期编号,值日老师,事件) values(3,'王老师','XX')
insert into 值日表(星期编号,值日老师) values(4,'黄老师')
insert into 值日表(星期编号,值日老师) values(5,'李老师')
insert into 值日表(星期编号,值日老师) values(6,'黄老师')
insert into 值日表(星期编号,值日老师,事件) values(7,'王老师',' XXX')
/*
delete 星期表
delete 值日表
*/
select 星期表.星期编号,星期,case when 值日老师 is null then '' else 值日老师 end as 值日老师,case when 事件 is null then '' else 事件 end as 事件 from 星期表 left outer join (select * from 值日表 where 值日老师=@Tname) as AA on 星期表.星期编号=AA.星期编号
if object_id(N'星期表',N'U') is not null
drop table 星期表
if object_id(N'值日表',N'U') is not null
drop table 值日表
楼上可以了。 不过这都只能一个老师一个老师关联才行。
如果一次性像这样把所有老师的安排选出来。又该怎样呢?
SELECT A.[星期编号],
A.[星期],
B.[值日老师],
B.[事件]
FROM TABLE1 A
LEFT JOIN
(SELECT * FROM TABLE2 WHERE ISNULL([事件],'')<>'') AS B
ON A.[星期编号]=B.[星期编号]
楼上方法,黄老师的一周数据不全。
--测试数据
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([星期编号] int,[星期] nvarchar(23))
Insert #T1
select 1,N'星期一' union all
select 2,N'星期二' union all
select 3,N'星期三' union all
select 4,N'星期四' union all
select 5,N'星期五' union all
select 6,N'星期六' union all
select 7,N'星期日'
GO
if not object_id(N'Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([星期编号] int,[值日老师] nvarchar(23),[事件] nvarchar(23))
Insert #T2
select 1,N'王老师',N'X' union all
select 2,N'李老师',null union all
select 4,N'王老师',N'XX' union all
select 4,N'黄老师',N'AA' union all
select 5,N'李老师',null union all
select 6,N'黄老师',N'AAA' union all
select 7,N'王老师',N'XXX'
Go
--测试数据结束
SELECT A.[星期编号],
A.[星期],
B.[值日老师],
B.[事件]
FROM #T1 A
left outer join
(SELECT * FROM #T2 WHERE ISNULL([事件],'')<>'') AS B
ON A.[星期编号]=B.[星期编号]
要的结果应该是这样子:
1 星期一 王老师 X
2 星期二 王老师
3 星期三 王老师 XX
4 星期四 王老师
5 星期五 王老师
6 星期六 王老师
7 星期日 王老师 XXX
1 星期一 黄老师
2 星期二 黄老师
3 星期三 黄老师
4 星期四 黄老师 AA
5 星期五 黄老师
6 星期六 黄老师 AAA
7 星期日 黄老师