2016-05-13 14 views
2

SQLクエリのWHERE句が正しく機能していない場合を使用しています。'where where'句のSQL Serverのケースを使用しているときの問題

問題:

私はTblEmployeeという名前の2つのテーブルを持っているとTblAssociate.Bothテーブルが共通の列PeriodId、EMPIDとAssociateIdが含まれています。私の要件があるべきTblAssociateからのEmpIDとAssociateIdの組み合わせで TblEmployeeから値を取得することですexcluded.And除外はPeriodIdに基づくべきである

If(@PeriodID<50) 
BEGIN 
    SELECT * 
    FROM TblEmployee 
    WHERE (EmpId+AssociateId) NOT IN (SELECT EmpId+AssociateId FROM TblAssociate) 
END 
ELSE 
BEGIN 
    SELECT * 
    FROM TblEmployee 
    WHERE (EmpId) NOT IN (SELECT EmpId FROM TblAssociate) 
END 

上記のコードが動作しているcondition.`が、私は避ける必要があります私が使用したいIF-ELSE条件と「ケースの時に」どこにclause.Please

+1

なぜ「AND」の代わりに「+」を使用していますか?誤った結果につながる可能性があります。 –

答えて

2

はこれを試してみてください助けること:

SELECT * 
FROM TblEmployee 
WHERE (EmpId + CASE WHEN @PeriodID<50 THEN AssociateId ELSE 0 END) NOT IN 
     (SELECT EmpId + CASE WHEN @PeriodID<50 THEN AssociateId ELSE 0 END FROM TblAssociate) 

あなたはあなたのコードが動作しているが、それはdoesnのため、これは、かなり奇妙であると言います一緒に追加するのは大変意味をなさないr idの値。いずれの場合でも、上記のステートメントは、最初に投稿されたコードと同等の結果を生成します。

0

の組み合わせをWHERE句に使用できます。また、+を使用しないでください。誤った結果につながる可能性があります。

SELECT e.* 
FROM TblEmployee e 
WHERE 
    (
     @PeriodID < 50 
     AND NOT EXISTS(
      SELECT 1 
      FROM TblAssociate a 
      WHERE 
       a.EmpId = e.EmpId 
       AND a.AssociateId = e.AssociateId 
     ) 
    ) 
    OR 
    (
     @PeriodID >= 50 
     AND NOT EXISTS(
      SELECT 1 
      FROM TblAssociate a 
      WHERE a.EmpId = e.EmpId 
     ) 
    ) 
0

IDの追加によって一意性が保証されるわけではありません。 EmpIdが6とAssociateIdは、以下のクエリでは5であっても、私はサブクエリは場合検索を停止することを確認しましたEmpId + AssociateId = 11ながら、例えば、EmpId 5とAssociateIdである場合には、図6に示すように、次にEmpId + AssociateId = 11であります最初のレコードが見つかり、値が1の単一のレコードが返されます。結果の中に1がある場合に限り、従業員を選択します。サブクエリでは、まずオペランドをチェックしてから、AssociateIdをチェックする必要があるか、一致するかどうかを確認します。

select * 
from TblEmployee 
where 1 in (select top 1 1 
      from TblAssociate 
      where TblEmployee.EmpId = TblAssociate.EmpId and 
      (@PeriodID >= 50 or TblEmployee.AssociateId = TblAssociate.AssociateId)) 
関連する問題