2017-11-30 1 views
0

Ich verwende SQL Server 2012 Express für die folgende Abfrage.Anzeigen von Datensätzen aus einer Tabelle, die sich nicht in einer anderen Tabelle befindet, durch mehrere Spalten

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 

Ich möchte von Table_A Datensätze anzuzeigen, die nicht in Table_B von client und typeofwork ist.

Ich brauche folgenden Ausgang.

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

Ich habe versucht, mit NOT IN aber es funktioniert nur mit einer Spalte

Danke im Voraus

Antwort

0

VERSUCHEN SIE DIESE: Verwenden Sie NOT EXISTS

Hier ist die vollständige Szenario für die Leichtigkeit:

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

Try this:

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

Gibt es noch eine andere Option ohne 'NOT IN' zu verwenden? Weil ich dieselbe Abfrage zweimal verwenden muss. Ich habe gerade eine Demo-Tabelle gezeigt, aber die tatsächlichen Tabellen sind sehr groß. – Hemal

+0

Sie könnten stattdessen "NOT EXISTS" verwenden. Leistung hängt davon ab, ob Ihre Tabelle null hat oder nicht. –

+0

Funktioniert meine Antwort für dich? –

-1

versuchen Sie folgendes:

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 

Danke.

+0

Diese alle Datensätze aus TABLE_A angezeigt werden – Hemal

+0

versuchen Sie dies: SELECT A. * VON TABLE_A A WHERE CLIENT + TYPEOFWORK NOT IN (SELECT CLIENT + TYPEOFWORK VON Table_B) – satishcse

+0

Ich glaube nicht, Meine nach unten gewählte Abfrage erzeugt eine andere als die akzeptierte Antwort. – satishcse

0

Ich gehe davon aus, dass Sie die Client-Spalten zu entsprechen und die Art der Arbeit, um nicht gleich zu sein, ist das richtig? Wenn ja, können Sie sich auf Ihre Spalte Bedingungen wie diese kommen links:

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

Versuchen Sie unter Abfrage:

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

Hoffentlich ist es Ihr Zweck dient. Siehe Demo here

Verwandte Themen