读书人

关于在SQL中要判断 多个条件有一个不成

发布时间: 2012-02-16 21:30:36 作者: rapoo

关于在SQL中要判断 多个条件有一个不成立的情况应该怎么写?
有三个表:
表一:

CREATE TABLE [dbo].[学生信息] (
[学生ID] [int] IDENTITY (1, 1) NOT NULL ,
[学号] [char] (15) COLLATE Chinese_PRC_CI_AS NULL ,
[姓名] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
) ON [PRIMARY]
GO
表二:
CREATE TABLE [dbo].[家庭信息] (
[家庭信息ID] [int] IDENTITY (1, 1) NOT NULL ,
[成员姓名] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[成员关系] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[学生ID] [int] NULL
) ON [PRIMARY]
GO
表三:

CREATE TABLE [dbo].[学生简历] (
[学生简历ID] [int] IDENTITY (1, 1) NOT NULL ,
[起始时间] [datetime] NULL ,
[终止时间] [datetime] NULL ,
[工作单位] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[学生ID] [int] NULL
) ON [PRIMARY]
GO


需要实现功能:在学生简历和家庭信息都不存在时才能删除学生信息表:
方法一:


CREATE PROCEDURE 删除学生信息
@学生ID int
AS
begin
set nocount on
if exists (
((select 家庭信息ID from dbo.家庭信息 where 学生ID=@学生ID) is null) and
((select 家庭信息ID from dbo.家庭信息 where 学生ID=@学生ID ) is null )
)
delete dbo.学生信息 where 学生ID=@学生ID

为什么报错:
服务器: 消息 156,级别 15,状态 1,过程 删除学生信息,行 7
在关键字 'is ' 附近有语法错误。
服务器: 消息 156,级别 15,状态 1,过程 删除学生信息,行 8
在关键字 'is ' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,过程 删除学生信息,行 10
第 10 行: '@学生ID ' 附近有语法错误。

方法二:


CREATE PROCEDURE 删除学生信息
@学生ID int
AS
begin
set nocount on
if not exists (
(select 家庭信息ID from dbo.家庭信息 where 学生ID=@学生ID) or
(select 家庭信息ID from dbo.家庭信息 where 学生ID=@学生ID )
)
delete dbo.学生信息 where 学生ID=@学生ID

报错:
服务器: 消息 156,级别 15,状态 1,过程 删除学生信息,行 8
在关键字 'or ' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,过程 删除学生信息,行 10
第 10 行: ') ' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,过程 删除学生信息,行 11
第 11 行: '@学生ID ' 附近有语法错误。

希望高手给予指教!请问在SQL中 or 关键字,能不能像在程序中那样做为‘或’运算!
在SQL 中要判断 多个条件有一个不成立的情况应该怎么写?

[解决办法]
汗,
按照你这个思路可以考虑这么写
CREATE PROCEDURE 删除学生信息
@学生ID int
AS
begin
DECLARE @sumCount int,
DECLARE @jlCount int,
DECLARE @jtCount int

set @jtcount=(select count(*) from 家庭信息 where 学生ID=@学生ID)

set @jlCount=(select count(*) from 学生简历 where 学生ID=@学生ID)
set @sumCount=@jlCount+@jtCount

if @sumCount=0
begin
delete dbo.学生信息 where 学生ID=@学生ID
end

------解决方案--------------------


EXISTS 指定一个子查询,检测行的存在。
语法
EXISTS subquery
subquery 是一个受限的 SELECT 语句---以上是它的语法,以下两种格式语法都正确
create PROCEDURE 删除学生信息 @学生ID int AS
begin
set nocount on
if(select 家庭信息ID from dbo.家庭信息 where 学生ID=@学生ID) is null and
((select 家庭信息ID from dbo.家庭信息 where 学生ID=@学生ID ) is null )

delete dbo.学生信息 where 学生ID=@学生ID
end

CREATE PROCEDURE 删除学生信息2
@学生ID int
AS
begin
set nocount on
if not exists (select 家庭信息ID from dbo.家庭信息 where 学生ID=@学生ID) or not exists
(select 家庭信息ID from dbo.家庭信息 where 学生ID=@学生ID )
delete dbo.学生信息 where 学生ID=@学生ID
end
[解决办法]
http://www.cnblogs.com/daniel206/archive/2007/01/19/624341.html

关于EXIST和COUNT效率问题,你可以参考一下上边的文章。

写的很好,看了之后你能对其有更深的了解,至于哪种效率更好,是要看其环境的,不同环境效率自然不同

读书人网 >SQL Server

热点推荐