外连接sql的一个问题
当在内连接查询中加入条件时,无论是将它加入到join子句,还是加入到where子句,其效果是完全一样的,但对于外连接情况就不同了。当把条件加入到 join子句时,会返回外连接表的全部行,然后使用指定的条件返回第二个表的行。如果将条件放到where子句中,将会首先进行连接操作,然后使用where子句对连接后的行进行筛选。例如:
(1)
select u.id, u.p_plan_id, u.unit_name, p.id, p.plan_name
from t_baidu_p_units u
left outer join t_baidu_p_plans p on u.p_plan_id = p.id
and p.id = 3176
where 1 = 1
order by u.p_plan_id desc
它会返回t_baidu_p_units表中所有行,t_baidu_p_plans表中符合join条件的字段不为null
(2)
select u.id, u.p_plan_id, u.unit_name, p.id, p.plan_name
from t_baidu_p_units u
left outer join t_baidu_p_plans p on u.p_plan_id = p.id
and p.id = 3176
where p.id is null
order by u.p_plan_id desc
查询的结果集中没有符合join条件的数据
(3)
select u.id, u.p_plan_id, u.unit_name, p.id, p.plan_name
from t_baidu_p_units u
left outer join t_baidu_p_plans p on u.p_plan_id = p.id
and p.id = 3176
where p.id is not null
order by u.p_plan_id desc
结果集中只包含join条件的数据
分析一下:
(1)where1=1对其进行过滤时,由于都符合此条件,因此没有改变结果集
(2)根据where p.id is null对于join后的结果集进行筛选,凡是p.id不为null的都要过滤掉,因此自然没有p.id=3176的结果
(
相关文档:
insert into Country123 ([Country_Id], [Region_ID], [Country_EN_Name], [Country], [Country_ALL_ID], [Country_Order_Id]) select [Country_Id], [Region_ID], [Country_EN_Name], [Country], [Country_ALL_ID], [Country_Order_Id] from openrowset( 'Microsoft.Jet.OLEDB.4.0', 'EXCEL 5.0;HDR=YES;IMEX=1; DATABASE= ......
declare @ID varchar(10)
set @ID=9 --根节点
declare @i int --级数
declare @t table(ID varchar(10),ParentID varchar(10),Level int)
set @i = 1
insert into @t select @ID,0,0 --当前级,本级,如果不要的话可以注释掉或再加个参数来选择操作
insert into @t select ID,ParentID,@i from t_ ......
根據前一篇關於自動備份的文章,對應的自動還原方案
create procedure [dbo].[sp_RestoreDatabase]
@SourceDirBackupFiles NVARCHAR(200)
as
declare @DatabaseName sysname
--Table to hold the result from RESTORE HEADERONLY. Needed to get the database name o ......
游标的类型:
1、静态游标(不检测数据行的变化)
2、动态游标(反映所有数据行的改变)
3、仅向前游标(不支持滚动)
4、键集游标(能反映修改,但不能准确反映插入、删除)
游标使用顺序:
1、定义游标
2、打开游标
3、使用游标
  ......