xml地图|网站地图|网站标签 [设为首页] [加入收藏]
sql关联查询,流程控制
分类:数据库

很多人可能想要查询整个树形表关联的内容都会通过循环递归来查...事实上在微软在SQL2005或以上版本就能用别的语法进行查询,下面是示例。

inner join(等值连接)只返回两个表中联结字段相等的行

图片 1
一、分支结构
1.If函数
语法:if(条件,值1,值2)
功能:实现双分支
应用范围:begin – 中 或者 外面
2.case结构
语法一:结构switch结构
case 变量或者表达式
when 值1 then 语句1;
when 值2 then 语句2;

else 语法n;
end case;
语法二:case
when 条件1 then 语句1;
when 条件2 then 语句2;

else 语句n;
end case;
应用在begin – end 中或者外面
3.if结构
语法:
if 条件1 then 语句1;
elseif 条件2 then 语句2;

else 语句n;
end if;
功能:类似于多重if
【只能应用在begin end中】
例1:创建函数,传入成绩,返回学生成绩等级
图片 2
图片 3
二、循环结构
图片 4
1.while
语法:【标签:】while 循环条件 do
循环体;
End while【标签】;
2.loop
语法:【标签:】loop
循环体;
End loop 【标签】;
【常用于模拟死循环】【借助标签来结束循环】
3.repeat
语法:【标签:】repeat
循环体;
Until 结束循环的条件
End repeat 【标签:】;
例2 向admin表中批量插入数据【不含循环控制语句】
图片 5
图片 6
例3 向admin表中批量插入数据,插入第6条的时候停止while循环
图片 7
图片 8
例4 只插入偶数次
图片 9
图片 10

 

left join(左联接)返回包括左表中的所有记录和右表中联结字段相等的记录

注:loop和repeat用法和while类似。

--通过子节点查询父节点
WITH 
TREE AS( 
    SELECT * FROM Areas 
    WHERE id = 6  -- 要查询的子 id 
    UNION ALL 
    SELECT Areas.* FROM Areas, TREE 
    WHERE TREE.PId = Areas.Id

SELECT Area FROM TREE

right join(右联接)返回包括右表中的所有记录和左表中联结字段相等的记录

 

INNER JOIN语法:

--通过父节点查询子节点
WITH 
TREE AS( 
    SELECT * FROM Areas 
    WHERE id = 7  -- 要查询的子 id 
    UNION ALL 
    SELECT Areas.* FROM Areas, TREE 
    WHERE TREE.Id = Areas.PId

SELECT Area FROM TREE

INNER JOIN连接两个数据表的用法:

 

SELECT * FROM 表1 INNER JOIN 表2 ON表1.字段号=表2.字段号

 通过子节点查询父节点查询结果为:

INNER JOIN连接三个数据表的用法:

图片 11

SELECT * FROM (表1 INNER JOIN 表2 ON表1.字段号=表2.字段号) INNER JOIN 表3 ON表1.字段号=表3.字段号

修改代码为

INNER JOIN连接四个数据表的用法:

 

SELECT * FROM ((表1 INNER JOIN 表2 ON表1.字段号=表2.字段号) INNER JOIN 表3 ON表1.字段号=表3.字段号) INNER JOIN

--通过子节点查询父节点
declare @area varchar(8000);
WITH 
TREE AS( 
    SELECT * FROM Areas 
    WHERE id = 6  -- 要查询的子 id 
    UNION ALL 
    SELECT Areas.* FROM Areas, TREE 
    WHERE TREE.PId = Areas.Id
)
select @area=isnull(@area,'')+Area from Tree order by id 
select Area= @area
则结果为:中国北京市丰台区

表4 ON Member.字段号=表4.字段号

 

INNER JOIN连接五个数据表的用法:

根据以上可以将这段代码封装为一个存储过程

SELECT * FROM (((表1 INNER JOIN 表2 ON表1.字段号=表2.字段号) INNER JOIN 表3 ON表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表5 ON Member.字段号=表5.字段号

 

连接六个数据表的用法:略,与上述联接方法类似,大家举一反三吧:)

-----存储过程,递归获取树形地区表字符串
if exists (select * from sysobjects where name='SP_GetAreaStr')
drop proc SP_GetAreaStr
go
create procedure SP_GetAreaStr 
 @id int
as
 declare @area varchar(8000)
begin
 WITH 
TREE AS( 
    SELECT * FROM Areas 
    WHERE id = @id  -- 要查询的子 id 
    UNION ALL 
    SELECT Areas.* FROM Areas, TREE 
    WHERE TREE.PId = Areas.Id
)
select @area=isnull(@area,'')+Area from Tree order by id 
select Area= @area
end 
go
--exec sp_helptext 'SP_GetAreaStr'
--go
exec SP_GetAreaStr 28
go

注意事项:

 

在输入字母过程中,一定要用英文半角标点符号,单词之间留一半角空格;
在建立数据表时,如果一个表与多个表联接,那么这一个表中的字段必须是“数字”数据类型,而多个表中的相同字段必须是主键,而且是“自动编号”数据类型。否则,很难联接成功。
代码嵌套快速方法:如,想连接五个表,则只要在连接四个表的代码上加一个前后括号(前括号加在FROM的后面,后括号加在代码的末尾即可),然后在后括号后面继续添加“INNER JOIN 表名X ON表1.字段号=表X.字段号”代码即可,这样就可以无限联接数据表了:)

查询结果:中国安徽省宿州市灵璧县

 

 

 

本文由澳门新葡亰手机版发布于数据库,转载请注明出处:sql关联查询,流程控制

上一篇:c# .Net :Excel NPOI导入导出操作教程之List集合的数据 下一篇:示例分享,与连接本地库的一些操作区别
猜你喜欢
热门排行
精彩图文