Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过多列显示一个表中不在另一个表中的记录_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 通过多列显示一个表中不在另一个表中的记录

Sql 通过多列显示一个表中不在另一个表中的记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在使用SQL Server 2012 Express进行以下查询 表A 表B 我想按客户机和工作类型显示表A中不在表B中的记录 我需要以下输出 CLIENT TYPEOFWORK ACTIVITY ------------------------------------------------------ CLIENT A WORK A ACTIVITY A CLIENT A

我正在使用SQL Server 2012 Express进行以下查询

表A

表B

我想按客户机和工作类型显示表A中不在表B中的记录

我需要以下输出

CLIENT             TYPEOFWORK                 ACTIVITY
------------------------------------------------------
CLIENT A            WORK A                    ACTIVITY A
CLIENT A            WORK B                    ACTIVITY B
我尝试了NOT IN,但它只适用于一个列

提前谢谢你

试试这个:

Select * from Table_A 
where Client NOT IN (Select Client from Table_B)
and TypeOFWork NOT IN (Select TypeOfWork from Table_B)
请尝试以下操作:

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
谢谢。

试试这个:使用不存在

以下是轻松的完整场景:

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)
输出:


我假设您希望客户端列匹配,并且工作类型不相同,对吗?如果是这样,您可以在列上按如下条件左键联接:

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 * FROM Table_A
WHERE 
  NOT EXISTS (
    SELECT * FROM Table_B WHERE CLIENT = Table_A.CLIENT AND TYPEOFWORK = Table_A.TYPEOFWORK
  )

希望它能达到你的目的。请参阅演示

是否有其他选项不使用“NOT IN”?因为我必须使用相同的查询两次。我刚刚展示了一个演示表,但实际的表非常大。您可以使用“不存在”来代替。性能方面,这取决于您的表是否为空。不,它不符合我的要求。这不是您想要的输出吗?我不明白这怎么不能回答你的问题。如果您的表非常大,您可以尝试使用Exists子句,但很难说它是否提高了查询的性能。虽然我已向上投票并已向下投票接受答案,但这将显示表中的所有记录,如下所示:从表A中选择A.*其中客户端+工作类型不在选择客户端+工作类型来自表B中。我不认为向下投票的查询将产生任何与接受答案不同的结果。
client      typeofwork  activity
----------------------------------
CLIENT A    WORK A      ACTIVITY A
CLIENT A    WORK B      ACTIVITY B
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;
SELECT * FROM Table_A
WHERE 
  NOT EXISTS (
    SELECT * FROM Table_B WHERE CLIENT = Table_A.CLIENT AND TYPEOFWORK = Table_A.TYPEOFWORK
  )