2016-07-05 126 views
0

SQL Server 2008 R2的存储过程中是否有可能为SELECT语句的WHERE有条件NOT IN子句?我有三个表,EmployeeTestingATestingB,其中employeeIDTestingA外键和TestingBSELECT WHERE中的条件NOT IN子句

CREATE TABLE [dbo].[Employee](
    [employeeID] [int] IDENTITY(9500,1) NOT NULL, 
    [firstName] [nvarchar](50) NOT NULL, 
    [middleName] [nvarchar](50) NULL, 
    [lastName] [nvarchar](50) NOT NULL, 
    [suffix] [nvarchar](50) NULL, 
    [createdDate] [datetime] NOT NULL CONSTRAINT [DF_Employee_createdDate] DEFAULT (getdate()), 
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
(
    [employeeID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

CREATE TABLE [dbo].[TestingA](
    [testingA_ID] [int] IDENTITY(1,1) NOT NULL, 
    [employeeID] [int] NOT NULL, 
    [isComplete] [bit] NULL CONSTRAINT [DF_TestingA_isComplete] DEFAULT ((0)), 
    [createdDate] [datetime] NOT NULL CONSTRAINT [DF_TestingA_createdDate] DEFAULT (getdate()), 
CONSTRAINT [PK_TestingA] PRIMARY KEY CLUSTERED 
(
    [testingA_ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

CREATE TABLE [dbo].[TestingB](
    [testingB_ID] [int] IDENTITY(1,1) NOT NULL, 
    [employeeID] [int] NOT NULL, 
    [isComplete] [bit] NULL CONSTRAINT [DF_TestingB_isComplete] DEFAULT ((0)), 
    [createdDate] [datetime] NOT NULL CONSTRAINT [DF_TestingB_createdDate] DEFAULT (getdate()), 
CONSTRAINT [PK_TestingB] PRIMARY KEY CLUSTERED 
(
    [testingB_ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

我需要做SELECTEmployee表基础上为它WHERE子句条件NOT IN存储过程的输入参数:

@Type nvarchar(50) 

基于对@Type的价值,我希望做一个NOT INTestingATestingB。所以它是这样的:

select e.employeeId from Employee e 
    where 
     -- If @Type = 'TestingA' Then 
     -- e.employeeID NOT IN (select ta.employeeID from TestingA ta) 
     -- End 
     -- Else    
     -- e.employeeID NOT IN (select tb.employeeID from TestingB ta) 
     -- End 

我该如何在Transact-SQL中做到这一点?谢谢。

+0

http:// stackoverf low.com/questions/337704/parameterize-an-sql-in-clause – Ako

回答

3
select e.employeeId 
from Employee e 
where @Type = 'TestingA' 
    AND not exists(select 1 from TestingA ta where ta.employeeID=e.employeeID) 
    OR @Type != 'TestingA' 
    AND not exists(select 1 from TestingB tb where tb.employeeID=e.employeeID) 
+0

谢谢,@IvanStarostin。 'select 1'是做什么的? – Alex

+1

“存在”中忽略选定的列表。有些人甚至喜欢在那里放置“1/0”。 –

+0

This Works,@IvanStarostin。谢谢!后续:“NOT IN”和“NOT EXISTS”有什么区别? – Alex

1

因为它是一个存储过程,我会做两个语句(这可能会提高性能)

IF @Type = 'TestingA' Then 
    select e.employeeId from Employee e 
     where e.employeeID NOT IN (select ta.employeeID from TestingA ta) 
else 
    select e.employeeId from Employee e 
     where e.employeeID NOT IN (select ta.employeeID from TestingB ta) 
1

使用此

select e.employeeId from Employee e 
where 
    e.employeeID NOT IN (case when @Type = 'TestingA' Then 
     (select ta.employeeID from TestingA ta) 
    Else    
    (select tb.employeeID from TestingB tb) 
    End) 

可以使用也加入了同查询如下

select e.employeeId from Employee e 
left join TestingA e1 on @Type='TestingA' and e.employeeId != e1.employeeID 
left join TestingB e2 on @Type!='TestingA' and e.employeeId != e2.employeeID