====谁帮忙看一下这个SQL语句怎么写?====

完美人生2013 2007-03-02 05:07:17
有两个表:UserClass和UserFile,数据分别如下:
UserClass:
userClassID userID userClassNo
---------------------------------------
1      1   0001
2      1   00010001
3      1   000100010001
4      1   000100010002
5      1   000100010003
6      1   00010002
7      1   000100020001
8      1   000100020002
9      2   00010002
10      2   000100020001
11      2   000100020002

UserFile:
userFileID userID userClassNo
---------------------------------------------
1      1   000100020002
2      2   000100020001

现在我想根据UserFile表,获得UserClass表的记录集合,关键是两个表userID相同,然后UserClass中显示包含UserFile的所有父分类,即:
返回UserClass:
userClassID userID userClassNo
---------------------------------------
1      1   0001
6      1   00010002
8      1   000100020002
9      2   00010002
10      2   000100020001

这样的语句怎么写?分不够再加啊~~~
...全文
379 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
完美人生2013 2007-03-02
  • 打赏
  • 举报
回复
原来这么容易,茅塞顿开啊~~~~~
完美人生2013 2007-03-02
  • 打赏
  • 举报
回复
谢谢大家的支持,我先测试测试
mengmou 2007-03-02
  • 打赏
  • 举报
回复
--创建测试环境
create table UserClass(userClassID int,userID int,userClassNo varchar(50))
create table UserFile(userFileID int,userID int,userClassNo varchar(50))


--插入测试数据
insert UserClass(userClassID,userID,userClassNo)
select '1','1','0001' union all
select '2','1','00010001' union all
select '3','1','000100010001' union all
select '4','1','000100010002' union all
select '5','1','000100010003' union all
select '6','1','00010002' union all
select '7','1','000100020001' union all
select '8','1','000100020002' union all
select '9','2','00010002' union all
select '10','2','000100020001' union all
select '11','2','000100020002'

insert UserFile(userFileID,userID,userClassNo)
select '1','1','000100020002' union all
select '2','2','000100020001'

--求解过程
Select _uc.*
From UserClass _uc
Join UserFile _uf
On _uc.userID = _uf.userID And _uf.userClassNo Like _uc.userClassNo + '%'


--删除测试环境
drop table UserClass
drop table UserFile
/*--测试结果
userClassID userID userClassNo
----------- ----------- --------------------------------------------------
1 1 0001
6 1 00010002
8 1 000100020002
9 2 00010002
10 2 000100020001

(所影响的行数为 5 行)
*/
Yang_ 2007-03-02
  • 打赏
  • 举报
回复
上面错了点


declare @UserClass table (
userClassID int,
userID int,
userClassNo varchar(30)
)

insert @UserClass
select
1,1,'0001'
union all select
2,1,'00010001'
union all select
3,1, '000100010001'
union all select
4,1,'000100010002'
union all select
5,1,'000100010003'
union all select
6,1,'00010002'
union all select
7,1,'000100020001'
union all select
8,1,'000100020002'
union all select
9,2,'00010002'
union all select
10, 2,'000100020001'
union all select
11, 2,'000100020002'


declare @UserFile table(
userFileID int,
userID int,
userClassNo varchar(30)
)

insert @UserFile
select
1,1,'000100020002'
union all select
2,2,'000100020001'

select * from @UserClass a
where exists (
select 1 from @UserFile b
where b.userID=a.userID
and b.userClassNo like rtrim(a.userClassNo)+'%'
)

--结果
userClassID userID userClassNo
----------- ----------- ------------------------------
1 1 0001
6 1 00010002
8 1 000100020002
9 2 00010002
10 2 000100020001

(所影响的行数为 5 行)

paoluo 2007-03-02
  • 打赏
  • 举报
回复
修改下

Create Table UserClass
(userClassID Int,
userID Int,
userClassNo Varchar(50))
Insert UserClass Select 1,1,'0001'
Union All Select 2,1,'00010001'
Union All Select 3, 1,'000100010001'
Union All Select 4,1,'000100010002'
Union All Select 5,1,'000100010003'
Union All Select 6,1,'00010002'
Union All Select 7,1,'000100020001'
Union All Select 8,1,'000100020002'
Union All Select 9,2,'00010002'
Union All Select 10, 2,'000100020001'
Union All Select 11, 2,'000100020002'

Create Table UserFile
(userFileID Int,
userID Int,
userClassNo Varchar(50))
Insert UserFile Select 1,1,'000100020002'
Union All Select 2,2,'000100020001'
GO
Select A.*
From UserClass A
Inner Join UserFile B
On A.userID = B.userID And B.userClassNo Like A.userClassNo + '%'
GO
Drop Table UserFile, UserClass
--Result
/*
userClassID userID userClassNo
1 1 0001
6 1 00010002
8 1 000100020002
9 2 00010002
10 2 000100020001
*/
paoluo 2007-03-02
  • 打赏
  • 举报
回复
如果你的編碼是這樣的規律的話,可以這麼寫

Select A.*
From UserClass A
Inner Join UserFile B
On A.userID = B.userID And B.userClassNo Like '%' + A.userClassNo + '%'
Yang_ 2007-03-02
  • 打赏
  • 举报
回复
select * from UserClass a
where exists (
select 1 from UserFile b
where b.userID=a.userID
and b.userClassNo like rtrim(userClassNo)+'%'
)

完美人生2013 2007-03-02
  • 打赏
  • 举报
回复
我现在的写法是:

SELECT uc.*
FROM UserClass uc LEFT OUTER JOIN
UserFile uf ON uc.userID = uf.userID AND uc.userClassNo IN(
SELECT * FROM uf_GetParentClassList(uf.userClassNo))

其中,uf_GetParentClassList()是一个用户定义函数,可以根据传入的编号返回一个内嵌表,比如输入000100020002返回下列表:
000100020002
00010002
0001
定义如下:
CREATE FUNCTION uf_GetParentClassList (@strClassNo VARCHAR(100))
RETURNS @tblClass TABLE (classNo VARCHAR(100)) AS
BEGIN

IF LEN(@strClassNo)<4 RETURN

INSERT @tblClass VALUES(@strClassNo)

WHILE(LEN(@strClassNo)>4)
BEGIN
SET @strClassNo=SUBSTRING(@strClassNo,1,LEN(@strClassNo)-4)
INSERT @tblClass VALUES(@strClassNo)
END

RETURN
END


然而上面的语句缺无法执行,返回下列错误信息:
服务器: 消息 155,级别 15,状态 1,行 14
'grpClassNo' 不是可以识别的 OPTIMIZER LOCK HINTS 选项。

34,870

社区成员

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

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