简体   繁体   中英

Display records from one table which is not in another table by multiple columns

I am using SQL Server 2012 Express for following query.

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

I want to display records from Table_A which is not in Table_B by client and typeofwork .

I need following output.

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

I tried with NOT IN but it works only with one column

Thank you in advance

TRY THIS : Use NOT EXISTS

Here is the full scenario for the ease:

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

I assume that you want the client columns to match and the typeofwork to not be the same, is that correct? If so, you can left join on your column conditions like this:

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
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;

Try using below query:

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

Hopefully it serves your purpose. See demo here

Try this:

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

try the following:

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

Thanks.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM