2016-04-22 6 views
0

これはではないです。 私はこのSQLを正しく動作させることができないようです。 ロジックは大丈夫だと思われますが、何か不足しています。 そして私は何年も何年ものノートの中でさえ、どこでも調べてきました。NOT EXISTS NOT NOISISとNOTの違いについての質問

CompanyAccountantRefという1つのテーブルには、3つのフィールドがあります。 ID、CompanyID、およびAccountantID。現在、表中の :

ID CompanyID AccountantID  
8  6706   346388  
9  6706   346256  
10  6706   26263  
11  363392  358951  

その後、このSQLは正しい行戻すされていません。

DECLARE @CompanyID INT = 363392 
DECLARE @AccountIDs TABLE (ID INT) 
INSERT INTO @AccountIDs (ID) VALUES (358951) 
INSERT INTO @AccountIDs (ID) VALUES (26263) 

SELECT @CompanyID AS CompanyID, a.ID 
FROM @AccountIDs a 
WHERE NOT EXISTS(
SELECT * 
FROM CompanyAccountantRef 
WHERE CompanyID = @CompanyID 
AND AccountantID IN (SELECT ID FROM @AccountIDs)) 

それは

CompanyID AccountantID 
    363392  26263 

バック持参してくださいはい、会計士は多くを持つことができますが1つの会社よりも 私はここで何が欠けていますか?それはそれを壊すINの使用ですか? 私は運がない結合を含むいくつかの異なる方法を試みました。

ありがとうございました。

+0

しかし、存在しないという表現は、と式があるかどうかです。 @AccountIDs a – Paparazzi

答えて

3

なぜあなたは混乱しているのか分かりません。サブクエリを考慮する:

SELECT * 
FROM CompanyAccountantRef 
WHERE CompanyID = @CompanyID AND 
     AccountantID IN (SELECT ID FROM @AccountIDs) 

CompanyAccountantRef一個の一致する行を有し、その会計士IDが358951であるので、これは、一つの行を返します。 @AccountIdsに一致があります。したがって、クエリは1つの行を返します。

したがって、NOT EXISTSはfalseです。行は返されません。

ある種の相関サブクエリが必要と思われます。私はあなたが探しているロジックがわからない。あなたが持っているロジックは特に役に立ちません(@AccountIdsのすべての行を返します)。

私は推測していた場合、あなたが何かを探して:非常に少なくとも

SELECT @CompanyID AS CompanyID, a.ID 
FROM @AccountIDs a 
WHERE NOT EXISTS (SELECT 1 
        FROM CompanyAccountantRef car 
        WHERE car.CompanyID = @CompanyID AND 
         car.AccountantID = a.ID 
       ); 

、これはあなたが探している行を返します。

+1

には結びついていません。私はカーソルを使いたくなかった(彼らは悪い)。ありがとう! –

0
select @CompanyID, ID 
    from AccountIDs 
except 
select @CompanyID, AccountantID  
    from CompanyAccountantRef 
where CompanyID = @CompanyID 
    and AccountantID in (SELECT ID FROM @AccountIDs) 
関連する問題