对不起,我再补充说明一下,资料表A与资料表E没有关联,我只想将资料表A做减肥的动作,
1.如果资料表A中某一ID之五个ITEM记录皆没有资料表E的其中一个组合,则将此笔ID的删除,例如:ID为B之第三笔为 333 999,可是这组合是不存在资料E中的,所以删除。
2. 资料表A中少于资料表E栏位数的记录皆删除,例如:ID为C之第三笔为333,可是只有一笔,而资料表E是二笔,故将ID为C之第三笔记录删除。
不知这样有没有比较清楚一点了呢?
感谢各位前辈的帮忙!
1.如果资料表A中某一ID之五个ITEM记录皆没有资料表E的其中一个组合,则将此笔ID的删除,例如:ID为B之第三笔为 333 999,可是这组合是不存在资料E中的,所以删除。
2. 资料表A中少于资料表E栏位数的记录皆删除,例如:ID为C之第三笔为333,可是只有一笔,而资料表E是二笔,故将ID为C之第三笔记录删除。
不知这样有没有比较清楚一点了呢?
感谢各位前辈的帮忙!
解决方案 »
- SQL查询人员一天最早和最晚时间,当只有一个时间,如何只显示最早,最晚为空?
- VS2010自带的SQL2008 Win7下怎么安装SSMS啊?我去微软网站上下的怎么安装不上
- 求一个记录定位的SQL
- 为什么第一次和非第一次对数据库的操作时间相差这么大
- 关对交叉查询解决方案
- SQL中的这种效果的交叉查询怎么做?
- 机器里装了个MSDE,现在要重装XP,MSDE该怎么备份,装好系统后又怎样恢复?
- 存储过程问题
- 请教:可以将开发版里的数据库全部复制到企业版吗?
- sql2005数据库可疑
- 高手请进,动态执行SQL语句问题以及sp_executesql的用法
- 数据库中如何把日期2007-10-25转为25 Oct 2007
可以请教一下触发器如何写吗?因为我是个新手,谢谢您~
ID ITEM1 ITEM2 ITEM3 ITEM4 ITEM5
========================================================
A 111 222 333
B 444 555 222
B 444 333 111 666 666
B 333 999
C 666 777 222 777
C 444 555 222 111
C 333
…资料表E:
ITEM_A ITEM_B
==============================
111 222
111 333
111 666
222 777
444 555
*/
--创建测试环境
create table D(ID nvarchar(16),ITEM1 int, ITEM2 int, ITEM3 int, ITEM4 int, ITEM5 int);
go
create table E(ITEM_A int, ITEM_B int);
goinsert D select 'A', 111, 222, 333, null, null
union all select 'B', 444, 555, 222, null, null
union all select 'B', 444, 333, 111, 666, 666
union all select 'B', 333, 999, null, null, null
union all select 'C', 666, 777, 222, 777, null
union all select 'C', 444, 555, 222, 111, null
union all select 'C', 333, null, null, null, null insert E select 111, 222
union all select 111, 333
union all select 111, 666
union all select 222, 777
union all select 444, 555--删除前
select * from Ddelete D from D
where not exists(
select 1 from E
where len(replace(replace(isnull(ltrim(ITEM1),'')+isnull(ltrim(ITEM2),'')+isnull(ltrim(ITEM3),'')+isnull(ltrim(ITEM4),'')+isnull(ltrim(ITEM5),''),ltrim(ITEM_A),''),ltrim(ITEM_B),''))
<= len(isnull(ltrim(ITEM1),'')+isnull(ltrim(ITEM2),'')+isnull(ltrim(ITEM3),'')+isnull(ltrim(ITEM4),'')+isnull(ltrim(ITEM5),''))-len(ltrim(ITEM_A) + ltrim(ITEM_B)))--删除后
select * from D--删除测试环境
drop table D
drop table E
执行结果:
ID ITEM1 ITEM2 ITEM3 ITEM4 ITEM5
---------------- ----------- ----------- ----------- ----------- -----------
A 111 222 333 NULL NULL
B 444 555 222 NULL NULL
B 444 333 111 666 666
B 333 999 NULL NULL NULL
C 666 777 222 777 NULL
C 444 555 222 111 NULL
C 333 NULL NULL NULL NULL(7 row(s) affected)(2 row(s) affected)ID ITEM1 ITEM2 ITEM3 ITEM4 ITEM5
---------------- ----------- ----------- ----------- ----------- -----------
A 111 222 333 NULL NULL
B 444 555 222 NULL NULL
B 444 333 111 666 666
C 666 777 222 777 NULL
C 444 555 222 111 NULL(5 row(s) affected)
*/
先谢谢您!
若是以上面数据,是可以做到结果,但是如果有下面一种情形的话,就不行了,
也就是若某ID的记录为三笔一样时,例如:111,111,111 因为这笔要删除,可是若用您的语法是删除不了的。
您能用这种方法来做真的很厉害,学到很多。
另外,我又发现了一点问题就是,若资料表E的记录顺序和资料表A不一样的话,也无法删除,例如:资料表A加一笔记录为:555,444
则无法删除此笔。麻烦您再帮我想想法子了,谢谢您!
(
select 1 from 资料表E b
where
charindex(cast(b.ITEM_A as varchar),isnull(cast(a.ITEM1 as varchar),'')+isnull(cast(a.ITEM2 as varchar),'')+isnull(cast(a.ITEM3 as varchar),'')+isnull(cast(a.ITEM4 as varchar),'')+isnull(cast(a.ITEM5 as varchar),''))>0
and
charindex(cast(b.ITEM_B as varchar),isnull(cast(a.ITEM1 as varchar),'')+isnull(cast(a.ITEM2 as varchar),'')+isnull(cast(a.ITEM3 as varchar),'')+isnull(cast(a.ITEM4 as varchar),'')+isnull(cast(a.ITEM5 as varchar),''))>0
)
select * from 资料表D
已添加纪录:111,111,111
已添加纪录:555,444
如果顺序不一样也要删,再加一个条件。
*/
declare @D table(ID char(1), ITEM1 int, ITEM2 int, ITEM3 int, ITEM4 int, ITEM5 int)
insert @D
select 'A', 111, 111, 111, null, null union all
select 'A', 111, 222, 333, null, null union all
select 'B', 444, 555, 222, null, null union all
select 'B', 444, 333, 111, 666, 666 union all
select 'B', 333, 999, null, null, null union all
select 'B', 555, 444, null, null, null union all
select 'C', 666, 777, 222, 777, null union all
select 'C', 444, 555, 222, 111, null union all
select 'C', 333, null, null, null, null
declare @E table(ITEM_A int, ITEM_B int)
insert @E
select 111, 222 union all
select 111, 333 union all
select 111, 666 union all
select 222, 777 union all
select 444, 555delete a from @D a where not exists
(
select 1 from @E b
where
charindex(cast(b.ITEM_A as varchar),isnull(cast(a.ITEM1 as varchar),'')+isnull(cast(a.ITEM2 as varchar),'')+isnull(cast(a.ITEM3 as varchar),'')+isnull(cast(a.ITEM4 as varchar),'')+isnull(cast(a.ITEM5 as varchar),''))>0
and
charindex(cast(b.ITEM_B as varchar),isnull(cast(a.ITEM1 as varchar),'')+isnull(cast(a.ITEM2 as varchar),'')+isnull(cast(a.ITEM3 as varchar),'')+isnull(cast(a.ITEM4 as varchar),'')+isnull(cast(a.ITEM5 as varchar),''))>0
and
charindex(reverse(cast(b.ITEM_B as varchar)),reverse(isnull(cast(a.ITEM1 as varchar),'')+isnull(cast(a.ITEM2 as varchar),'')+isnull(cast(a.ITEM3 as varchar),'')+isnull(cast(a.ITEM4 as varchar),'')+isnull(cast(a.ITEM5 as varchar),'')))
<
charindex(reverse(cast(b.ITEM_A as varchar)),reverse(isnull(cast(a.ITEM1 as varchar),'')+isnull(cast(a.ITEM2 as varchar),'')+isnull(cast(a.ITEM3 as varchar),'')+isnull(cast(a.ITEM4 as varchar),'')+isnull(cast(a.ITEM5 as varchar),'')))
)select * from @D/*
ID, ITEM1, ITEM2, ITEM3, ITEM4, ITEM5
A, 111, 222, 333, NULL, NULL
B, 444, 555, 222, NULL, NULL
B, 444, 333, 111, 666, 666
C, 666, 777, 222, 777, NULL
C, 444, 555, 222, 111, NULL
*/
谢谢您!
请问若记录的顺序也要考虑的话,要如何达到呢?
例如:资料表A加一笔记录为:555,444
则无法删除此笔。麻烦您了!
抱歉!贴完才看到上面的回贴,我再看看,谢谢您!
已添加纪录:111,111,111
已添加纪录:555,444
如果顺序不一样也要删,再加一个条件。哈,不用函数,用patindex一下子就搞定了,代码还更简单:
又加了纪录:555,444,555,444
*/
declare @D table(ID char(1), ITEM1 int, ITEM2 int, ITEM3 int, ITEM4 int, ITEM5 int)
insert @D
select 'A', 111, 111, 111, null, null union all
select 'A', 111, 222, 333, null, null union all
select 'B', 444, 555, 222, null, null union all
select 'B', 444, 333, 111, 666, 666 union all
select 'B', 333, 999, null, null, null union all
select 'B', 555, 444, 555, 444, null union all
select 'C', 666, 777, 222, 777, null union all
select 'C', 444, 555, 222, 111, null union all
select 'C', 333, null, null, null, null
declare @E table(ITEM_A int, ITEM_B int)
insert @E
select 111, 222 union all
select 111, 333 union all
select 111, 666 union all
select 222, 777 union all
select 444, 555delete a from @D a where not exists
(
select 1 from @E b
where
patindex('%'+cast(+b.ITEM_A as varchar)+'%'+cast(b.ITEM_B as varchar)+'%',isnull(cast(a.ITEM1 as varchar),'')+isnull(cast(a.ITEM2 as varchar),'')+isnull(cast(a.ITEM3 as varchar),'')+isnull(cast(a.ITEM4 as varchar),'')+isnull(cast(a.ITEM5 as varchar),''))>0
)select * from @D/*
ID, ITEM1, ITEM2, ITEM3, ITEM4, ITEM5
A, 111, 222, 333, NULL, NULL
B, 444, 555, 222, NULL, NULL
B, 444, 333, 111, 666, 666
B, 555, 444, 555, 444, NULL
C, 666, 777, 222, 777, NULL
C, 444, 555, 222, 111, NULL
*/
1.我的代码确实不会删除如:111,111,111的数据,2.但类似555,444这样的数据是不会误删的。
要避免1中的情况,代码需要稍作修改,但建议你用小楼的方法,他的效率高一些,呵呵
/*资料表D:
ID ITEM1 ITEM2 ITEM3 ITEM4 ITEM5
========================================================
A 111 222 333
B 444 555 222
B 444 333 111 666 666
B 333 999
C 666 777 222 777
C 444 555 222 111
C 333
…资料表E:
ITEM_A ITEM_B
==============================
111 222
111 333
111 666
222 777
444 555
*/
--创建测试环境
create table D(ID nvarchar(16),ITEM1 int, ITEM2 int, ITEM3 int, ITEM4 int, ITEM5 int);
go
create table E(ITEM_A int, ITEM_B int);
goinsert D select 'A', 111, 222, 333,null,null
union all select 'B', 444, 555, 222,null,null
union all select 'B', 444, 333, 111,666, 666
union all select 'B', 333, 999, null,null,null
union all select 'C', 666, 777, 222,777,null
union all select 'C', 444, 555, 222,111,null
union all select 'C', 333, null,null,null,null
union all select 'C', 444, 555, 444, 555,null
union all select 'C', 111, 111, 111, 111,null
union all select 'C', 555, 444, 555,null,444 insert E select 111, 222
union all select 111, 333
union all select 111, 666
union all select 222, 777
union all select 444, 555--删除前
select * from Ddelete D from D
where not exists(
select 1 from E
where replace(isnull(ltrim(ITEM1),'')+isnull(ltrim(ITEM2),'')+isnull(ltrim(ITEM3),'')+isnull(ltrim(ITEM4),'')+isnull(ltrim(ITEM5),''),ltrim(ITEM_A),'')
<> isnull(ltrim(ITEM1),'')+isnull(ltrim(ITEM2),'')+isnull(ltrim(ITEM3),'')+isnull(ltrim(ITEM4),'')+isnull(ltrim(ITEM5),'')
and
replace(isnull(ltrim(ITEM1),'')+isnull(ltrim(ITEM2),'')+isnull(ltrim(ITEM3),'')+isnull(ltrim(ITEM4),'')+isnull(ltrim(ITEM5),''),ltrim(ITEM_B),'')
<> isnull(ltrim(ITEM1),'')+isnull(ltrim(ITEM2),'')+isnull(ltrim(ITEM3),'')+isnull(ltrim(ITEM4),'')+isnull(ltrim(ITEM5),'')
)
--删除后
select * from D--删除测试环境
drop table D
drop table E
真是高人,又学习到了!
可是我又有一个问题,就是资料表E加一笔:22, 777,照理来讲,资料表A有222,777的记录要被删除,可是却没有。TO:dobear_0922(do熊)
谢谢您^^
这么简单的问题……
*/
declare @D table(ID char(1), ITEM1 int, ITEM2 int, ITEM3 int, ITEM4 int, ITEM5 int)
insert @D
select 'A', 111, 111, 111, null, null union all
select 'A', 111, 222, 333, null, null union all
select 'B', 444, 555, 222, null, null union all
select 'B', 444, 333, 111, 666, 666 union all
select 'B', 333, 999, null, null, null union all
select 'B', 555, 444, 555, 444, null union all
select 'C', 666, 777, 222, 777, null union all
select 'C', 444, 555, 222, 111, null union all
select 'C', 333, null, null, null, null
declare @E table(ITEM_A int, ITEM_B int)
insert @E
select 111, 222 union all
select 111, 333 union all
select 111, 666 union all
select 22, 777 union all
select 444, 555delete a from @D a where not exists
(
select 1 from @E b
where
patindex('%,'+cast(+b.ITEM_A as varchar)+',%,'+cast(b.ITEM_B as varchar)+',%',',,'+isnull(cast(a.ITEM1 as varchar),'')+',,'+isnull(cast(a.ITEM2 as varchar),'')+',,'+isnull(cast(a.ITEM3 as varchar),'')+',,'+isnull(cast(a.ITEM4 as varchar),'')+',,'+isnull(cast(a.ITEM5 as varchar),'')+',,')>0
)select * from @D/*
ID, ITEM1, ITEM2, ITEM3, ITEM4, ITEM5
A 111 222 333 NULL NULL
B 444 555 222 NULL NULL
B 444 333 111 666 666
B 555 444 555 444 NULL
C 444 555 222 111 NULL
*/
您真是高人…
已经无可挑剔了!
以后一定要跟您多学习,先给分!^^