2017-11-30 16 views
0

次の問合せでSQL Server 2012 Expressを使用しています。複数の列で別の表にない1つの表のレコードを表示

Table_A

CLIENT    TYPEOFWORK    ACTIVITY 
----------------------------------------------------- 
CLIENT A   WORK A     ACTIVITY A 
CLIENT A   WORK B     ACTIVITY B 
CLIENT A   WORK C     ACTIVITY C 
CLIENT A   WORK C     NULL 

Table_B

CLIENT    TYPEOFWORK     STATUS 
-------------------------------------------------------- 
CLIENT A    WORK C      COMPLETED 

私はclienttypeofworkTable_BにされていないTable_Aからレコードを表示したいです。

次の出力が必要です。

CLIENT    TYPEOFWORK     ACTIVITY 
------------------------------------------------------ 
CLIENT A   WORK A     ACTIVITY A 
CLIENT A   WORK B     ACTIVITY B 

私はNOT INと試みたが、それはこの試しください

は事前

答えて

0

TRY THIS:使用ここでNOT EXISTS

を容易にするために、完全なシナリオです:

CREATE TABLE #table_a(CLIENT VARCHAR(50), TYPEOFWORK VARCHAR(50), ACTIVITY VARCHAR(50)) 
INSERT INTO #table_a VALUES 
('CLIENT A', 'WORK A', 'ACTIVITY A'), 
('CLIENT A', 'WORK B', 'ACTIVITY B'), 
('CLIENT A', 'WORK C', 'ACTIVITY C'), 
('CLIENT A', 'WORK C', NULL) 

CREATE TABLE #table_b(CLIENT VARCHAR(50), TYPEOFWORK VARCHAR(50), STATUS VARCHAR(50)) 
INSERT INTO #table_b values 
('CLIENT A', 'WORK C', 'COMPLETED') 

SELECT 
    a.client, 
    a.typeofwork, 
    a.activity 
FROM #table_a a 
WHERE NOT EXISTS(SELECT 1 FROM #table_b b 
       WHERE a.client = b.client AND a.typeofwork = b.typeofwork) 

はOUTPUT:

client  typeofwork activity 
---------------------------------- 
CLIENT A WORK A  ACTIVITY A 
CLIENT A WORK B  ACTIVITY B 
-1

でいただきありがとうございます1列でのみ動作します:次のことを試してください

Select * from Table_A 
where Client NOT IN (Select Client from Table_B) 
and TypeOFWork NOT IN (Select TypeOfWork from Table_B) 
+0

「NOT IN」を使用せずに他のオプションがあるのは同じクエリを2回使用する必要があるためです。私はデモテーブルを見せているだけですが、実際のテーブルは非常に大きいです。 – Hemal

+0

代わりに「存在しない」を使用できます。パフォーマンスは賢明です。テーブルがnullかどうかによって異なります。 –

+0

私の答えはあなたのために働くのですか? –

-1

を:

SELECT A.* 
FROM TABLE_A A 
LEFT JOIN TABLE_B B ON B.CLIENT = A.CLIENT AND A.TYPEOFWORK = B.TYPEOFWORK 
WHERE B.[STATUS] IS NULL 

ありがとう。

+0

をDOWNVOTED私の下に投票された質問は、受け入れられた答えとは異なるものを作り出すでしょう。 – Hemal

+0

からすべてのレコードはこれを試して表示されます受け入れ答え – satishcse

+0

私は考えていないTABLE_A A FROM SELECT A. * :しかし私UPVOTEDはすでに、これはTABLE_A – satishcse

0

私はあなたがクライアント列をしたいと仮定それと一致するように型式を一致させることは正しいですか?もしそうなら、あなたはこのようなあなたのコラムの条件に参加することができます左:

SELECT A.CLIENT, A.TYPEOFWORK, A.STATUS 
FROM TABLE_A A 
LEFT JOIN TABLE_B B ON B.CLIENT = A.CLIENT AND 
A.TYPEOFWORK <> B.TYPEOFWORK 
WHERE B.CLIENT IS NULL 
0
SELECT A.CLIENT, A.TYPEOFWORK, A.ACTIVITY 
FROM TABLE_A A 
LEFT JOIN TABLE_B B 
ON A.CLIENT = B.CLIENT 
AND A.TYPEOFWORK = B.TYPEOFWORK 
WHERE B.CLIENT IS NULL 
OR B.TYPEOFWORK IS NULL; 
0

をクエリの下に使用してみてください:

SELECT * FROM Table_A 
WHERE 
    NOT EXISTS (
    SELECT * FROM Table_B WHERE CLIENT = Table_A.CLIENT AND TYPEOFWORK = Table_A.TYPEOFWORK 
) 

うまくいけば、それはあなたの目的を果たします。デモを見る

関連する問題