查找SQL Server中不在其他表中的表中的人数

查找SQL Server中不在其他表中的表中的人数,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有3个表(比如A、B和C),在所有3个表中都有一个公共键列,称为G。 我需要一个脚本来查找a(主表-级别1)中不在B或C(级别2表)中的G数。基本上,我想在其他两个表完全联接的结果上左联接一个表 我尝试了左连接,但结果不正确。我使用了以下脚本: SELECT COUNT(DISTINCT A.G) FROM A LEFT JOIN B ON A.G = B.G FULL JOIN C ON A.G = C.G WHERE (B.G IS NULL) OR (C.G IS NULL)

我有3个表(比如A、B和C),在所有3个表中都有一个公共键列,称为G。 我需要一个脚本来查找a(主表-级别1)中不在B或C(级别2表)中的G数。基本上,我想在其他两个表完全联接的结果上左联接一个表

我尝试了左连接,但结果不正确。我使用了以下脚本:

SELECT COUNT(DISTINCT A.G)
FROM A LEFT JOIN B ON A.G = B.G
     FULL JOIN C ON A.G = C.G
WHERE (B.G IS NULL) OR (C.G IS NULL)
谢谢你的帮助

p.S. 正确答案的选择基于处理时间的优势。我在我的数据集上运行了两种选择(存在连接与左连接)(这两种连接相对较大且耗时)

LEFT JOIN
方法(选择的答案)比
存在的方法更高效。前一次进近需要0:23分钟,而后一次进近需要7:52分钟。

使用
不存在()
计数()
行,其中
G
不存在于
B
C

select count(*)
from A
where not exists (select 1 from B where A.G = B.G)
   or not exists (select 1 from C where A.G = C.G)
如果要对
B
C
中都不存在
G
count()
行进行计数,请将上述代码中的
更改为


rextester示例演示:

您很接近了-您需要一个左连接到
B
C
表以及
而不是
where
子句中的

SELECT COUNT(DISTINCT A.G)
FROM A
LEFT JOIN B ON A.G = B.G
LEFT JOIN C ON A.G = C.G
WHERE B.G IS NULL
AND C.G IS NULL;

我怀疑你想要:

select count(*)
from a
where not exists (select 1 from b where a.g = b.g) and
      not exists (select 1 from c where a.g = c.g);
您可以指定:“在A中……不在B或C中”。这表明
G
不存在于
B
中,也不存在于
C
中。因此是
,而不是
(如您的查询版本)


我还删除了
计数(独立)
。本能表明,
a.g
是独一无二的。如果不正确,则计数(不同的a.g)
是正确的。

最后一个使用set运算符的选项应该学习。为了证明正确性,我将不计算:

set nocount on;
declare @a table (id smallint not null); 
declare @b table (id smallint not null, xx smallint not null); 
declare @c table (id smallint not null, yy smallint not null); 

insert @a(id) values (1), (2), (3), (4);
insert @b(id, xx) values (1,0), (1,1), (3, 0); 
insert @c(id, yy) values (1,9), (2, 1), (2,2), (5,1); -- notice the value 5 does not exist in @a

select id from @a except 
select id from @b except 
select id from @c
;

为什么要对C进行完全连接而不是左连接。是的,我做了错误的完全连接,因为G在表a中不能被表示多次。不需要使用distinct,可以简单地进行计数,但对于这种类型的连接,我也更喜欢existsquery@Matt对如果
G
是唯一的,那么
distinct
将产生不必要的开销,应该删除。只是澄清一下,G在a中是唯一的,但在B或B中不能重复C@Meysa感谢您的澄清,我更新了我的答案,删除了
distinct
。1。我希望查询显示不在B和C中的人数。因此,我将或改为和;在运行了所有答案之后,我选择了这个答案作为正确答案,因为它在过程中具有优势time@gordon-你为什么这么认为?OP说这个答案运行得更快,很明显两个都应该返回相同的数据。不幸的是,我不知道如何使用这个方法