sql查询问题
发布网友
发布时间:2022-04-08 01:14
我来回答
共5个回答
热心网友
时间:2022-04-08 02:44
create table books(id int primary key,articles varchar(100))
insert into books values(1,'1,2,3')
insert into books values(2,'4,5,6')
--select * from books
create table articles(id int primary key,authors varchar(100))
insert into articles values(1,'1,2,3')
insert into articles values(2,'4,5,6')
insert into articles values(3,'4,5,6')
insert into articles values(4,'4,5,6')
insert into articles values(5,'1,2,3')
insert into articles values(6,'1,2,3')
--select * from articles
create table author(id int primary key,authorName varchar(100))
insert into author values(1,'张三')
insert into author values(2,'李四')
insert into author values(3,'王五')
insert into author values(4,'小麦')
insert into author values(5,'小王')
insert into author values(6,'小李')
--select * from author
--drop function MySql1
create function MySql1(@id int)
returns varchar(8000)
as
begin
declare @len int,@ar varchar(100),@sql varchar(8000)
set @sql='select distinct authors from articles where '
select @ar=articles from books where id=1
select @len=len(@ar)
while(@len>0)
begin
if(left(@ar,1)<>',')
begin
select @sql=@sql+'id='+left(@ar,1)+' '
if(@len>1)
select @sql=@sql+'or '
end
set @len=@len-1
set @ar=substring(@ar,2,@len)
end
return (@sql)
end
--select dbo.MySql1(1)
--exec sp_helptext Mysql1
--drop proc Myprc
create table MyetempTB(chr varchar(100))
create proc Myprc(@Myii int)
as
begin
declare @sql varchar(8000) set @sql=dbo.Mysql1(@Myii)
exec (@sql)
end
go
--drop proc Myprc2
create proc Myprc2(@Myii int)
as
begin
delete from MyetempTB
insert into MyetempTB exec dbo.Myprc @Myii
declare @ret varchar(8000)
set @ret = ''
select @ret = @ret+','+chr from MyetempTB
set @ret = stuff(@ret,1,1,'')
declare @sql varchar(8000)
set @sql='select distinct * from author where '
declare @len int set @len=len(@ret)
while(@len>0)
begin
if(left(@ret,1)<>',')
begin
select @sql=@sql+'id='+left(@ret,1)+' '
if(@len>1)
select @sql=@sql+'or '
end
set @len=@len-1
set @ret=substring(@ret,2,@len)
end
exec (@sql)
end
go
执行:
exec Myprc2 1
测试结果如下:
(所影响的行数为 2 行)
(所影响的行数为 2 行)
id authorName
----------- ----------------------------------------------------------------------------------------------------
1 张三
2 李四
3 王五
4 小麦
5 小王
6 小李
(所影响的行数为 6 行)
--基本逻辑如下:
--首先查询出books表中的articles
--MySql1函数:
--它是将articles查询出的结果拼凑成一条查询语句,此条查询语句拼凑后基本如下:
--'select distinct authors from articles where id=1 or id=2 or id=3'
--当然如果查询出的结果是7,8,9 那拼凑后的语句就是:
--'select distinct authors from articles where id=7 or id=8 or id=9'
--create table MyetempTB(chr varchar(100))是建立一个转储表,这个表是不可缺少的
--存储过程 Myprc(@Myii int)是将拼凑的语句查询出表
--存储过程Myprc2函数主要步骤:
--将Myprc查询出的表利用临时转储表储存,在将转储表的authors字段内的所有内容组合起来拼凑成查询语句
--转储表的内容是两行数据:
--第一行: 1,2,3
--第二行: 4,5,6
--内容组合: 1,2,3,4,5,6
--查询语句拼凑后如下:
--'select distinct * from author where id=1 or id=2 or id=3 or id=4 or id=5 or id=6'
--执行Myprc2 参数是你要查询的ID
--执行结果当然是楼主你想要的数据了
--楼主可以多插入一些测试数据,测试一下是否正确
热心网友
时间:2022-04-08 04:02
select * from author where id in(select authors from articles where id in (select artices from books where id =1) )
没列名,不能给出查询条件。
没有LIKE就不嫩查吗?什么逻辑?这里都说了查ID是1的名单,LIKE个毛啊!
热心网友
时间:2022-04-08 05:36
select * from author a ,authors b ,books c
where a.id =b.authors
and b.id =c.articles
and c.id =1
热心网友
时间:2022-04-08 07:28
上面两位纯粹是胡乱回答
一对多连接关系, 外键关系需要保存在多的那张表里, 的你这数据表设置完全反了, 如果是刚开始做, 建议修改数据结构吧, Books表删除Articles列, Articles表增加BooksId列来保存文章对应的书籍, 并删除authors列, authors里面增加articlesId列来保存作者对应的书籍, 如果是在多对多关系, 则关系需要另外建表
热心网友
时间:2022-04-08 09:36
兄弟你这样设计好像违反了3范式。。好像连第一范式不满足不了。。如果要多对多的话。。建一个中间表吧。。。