2016-07-05 128 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