2016-07-05 17 views
0

SELECTステートメントのWHEREに対して、SQL Server 2008 R2のストアドプロシージャで条件付きNOT IN句を使用できますか?私はに基づいてそのWHERE句の条件NOT INEmployeeテーブルの上にSELECTを行う必要がありSELECT WHERE内の条件付きNOT句

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] 

:私はemployeeIDは外国TestingAでキーとTestingBである3つのテーブル、EmployeeTestingA、およびTestingBを、持っていますストアドプロシージャの入力パラメータ:@Typeの値に基づいて

@Type nvarchar(50) 

は、私がをしたいです210 TestingAまたはTestingBである。したがって、これは次のようなものです。

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

ありがとう、@イバンスタロスティン。 'select 1'は何をするのですか? – Alex

+1

選択された列リストは 'exists'で無視されます。いくつかはそこに '1/0'を置くのが好きです。 –

+0

これは@IvanStarostinで動作します。ありがとう!フォローアップ:「NOT IN」と「NOT EXISTS」の違いは何ですか? – Alex

1

それは私は2つの文にしてくださいストアドプロシージャは、(それはおそらく、パフォーマンスを向上させます)

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