一对多的反查询

苦苦的潜行者 2011-10-13 11:21:35
现有

表1
reqeustfilesystem
字段
fileid(主键) requestfilename
1 ab
2 bc
表2
programfilesystem
字段
exeid(主键) fileid(和表1的对应) programfilename
1 1 a.doc
2 1 b.doc
3 2 a.doc
-------------------
其中*id都为数值型


我想实现表2中相同fileid在更新programfilename时能够检测存在,
如我要将b.doc改成a.doc,会提示ab中已经存在a.doc你不能再添加相同;
由于bc和ab的fileid不同所以在更新时不提示.

我现在只知道exeid=2和要把exeid=2的programfilename更新为"a.doc"
我想要一句sql语句实现,现有两种想法

一.我根据exeid=2反查询表1的fileid,然后查找"a.doc"在表2中(对应表1的fileid)是否存在,我写的语句如下,但是实现不了,只能查询出"b.doc"[我觉得我这个想法绕的很远]
select a.programfilename from programfilesystem as a where a.fileid=(select fileid from requestfilesystem as b where a.exeid=2 and a.fileid=b.fileid)
这一句的结果相当于
select programfilename from programfilesystem where exeid=2
我居然不明白为什么这样


二.我不需要查询fileid,我只需要找表2中与exeid=2相同fileid的记录是否存在"a.doc",这可能需要内连接,但是我不会写.


请大神们指点一二,或者有更好的想法也告诉我,谢谢了.

...全文
146 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
苦苦的潜行者 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fredrickhu 的回复:]
SQL code
select
*
from
programfilesystem a
where
exists(select 1 from requestfilesystem where fileid=a.fileid and programfilename='a.doc')
[/Quote]

我现在终于明白select 1的意思了.
你的查询语句是查询所有programfilesystem下所有programfilename='a.doc'(因为我programfilesystem的fileid都是根据requestfilesystem中的fileid生成的)

我一开始以为select 1 from就是select top 1 from 呢,原来根本就是两码事啊.
嗯,虽然跟我提问的问题还是有点出入,但还是受教了.thx
苦苦的潜行者 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kensouterry 的回复:]
SQL code

use tempdb
go

declare @requestfilesystem table
(
fileid int identity(1,1),
requestfilename varchar(10)
);
declare @programfilesystem table
(
exeid int,
fieldid ……
[/Quote]


谢谢你的亲自测试,虽然不是很懂你写的东西,但是我看到最后一句sql查询语句了.跟我3楼写的是一样的.多谢咯
kensouterry 2011-10-14
  • 打赏
  • 举报
回复

use tempdb
go

declare @requestfilesystem table
(
fileid int identity(1,1),
requestfilename varchar(10)
);
declare @programfilesystem table
(
exeid int,
fieldid int,
programfilename varchar(50)
);

insert into @requestfilesystem values('ab')
insert into @requestfilesystem values('bc')

insert into @programfilesystem values(1,1,'a.doc')
insert into @programfilesystem values(2,1,'b.doc')
insert into @programfilesystem values(3,2,'b.doc')


--preparing update exeid=2
-- variable exeid=2
;With CTE
as
(
Select exeid, programfilename
from @programfilesystem p
where p.fieldid=(select fieldid from @programfilesystem where exeid=2)
)
--在这里找到所有不能修改的名字,
/*假设要修改的记录为exeid=2,那么除exeid=2以外的所有记录名称都不符合条件*/
select programfilename
from CTE
where exeid<>2

苦苦的潜行者 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fredrickhu 的回复:]
SQL code
select
*
from
programfilesystem a
where
exists(select 1 from requestfilesystem where fileid=a.fileid and programfilename='a.doc')
[/Quote]

大姐果然犀利! 我是不是太强调exeid=2使得我自己陷入混乱了?还有就是为什么要用select 1呢?
大姐我用第二个想法写出来了.
用的自查询,你帮忙看看
select a.programfilename from programfilesystem as a where a.fileid=(select b.fileid from programfilesystem as b where a.fileid=b.fileid and b.exeid=2) and programfilename='a.doc'
中国风 2011-10-13
  • 打赏
  • 举报
回复
用觸發器控制
--小F-- 2011-10-13
  • 打赏
  • 举报
回复
select
*
from
programfilesystem a
where
exists(select 1 from requestfilesystem where fileid=a.fileid and programfilename='a.doc')

34,594

社区成员

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

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