Sql 两个查询之间的差异-加入与加入

Sql 两个查询之间的差异-加入与加入,sql,Sql,我有以下两个问题。Query1返回1000作为行计数,而as Query2返回4000作为行计数。有人能解释一下这两个问题之间的区别吗。我希望两个都能返回相同的计数 查询1: SELECT COUNT(*) FROM TableA A WHERE A.VIN IN ( SELECT VIN FROM TableB B, TableC C WHERE B.MODEL_YEAR = '2014' AND B.VIN_NBR = C.VIN ) SELECT COUNT

我有以下两个问题。Query1返回1000作为行计数,而as Query2返回4000作为行计数。有人能解释一下这两个问题之间的区别吗。我希望两个都能返回相同的计数

查询1:

SELECT COUNT(*) 
FROM TableA A 
WHERE A.VIN IN (
    SELECT VIN 
    FROM TableB B, TableC C
    WHERE B.MODEL_YEAR = '2014' AND B.VIN_NBR = C.VIN
)
SELECT COUNT(*) 
FROM TABLEA A, TableB B, TableC C
WHERE B.MODEL_YEAR = '2014' AND B.VIN_NBR = C.VIN AND A.VIN = C.VIN
查询2:

SELECT COUNT(*) 
FROM TableA A 
WHERE A.VIN IN (
    SELECT VIN 
    FROM TableB B, TableC C
    WHERE B.MODEL_YEAR = '2014' AND B.VIN_NBR = C.VIN
)
SELECT COUNT(*) 
FROM TABLEA A, TableB B, TableC C
WHERE B.MODEL_YEAR = '2014' AND B.VIN_NBR = C.VIN AND A.VIN = C.VIN

在许多情况下,他们会返回相同的答案,但不一定。第一种方法统计数据集中与条件匹配的行数——不管匹配的数目如何,每行只统计一次。第二个执行一个
连接
,它可以将行数相乘

如果第二个查询使用
count(distinct A.id)
,其中
id
是唯一的或主键,那么它的结果将是等价的

也就是说,尽管它们在功能上相似,但它们的执行方式可能会有很大的不同。不同的SQL引擎可能会更好地优化一个版本或另一个版本


顺便说一下,您应该避免使用过时的
join
语法。自1992年以来,显式联接一直是SQL语法的一部分。

对于a,可能会返回多行。我们完全同意古老的联接语法。我几乎以为你有一些交叉积在进行,在这种情况下,第二个查询会比第一个查询大大膨胀。