SQL:为什么我突然从这个声明中获得了200多行?

时间:2011-02-04 17:11:07

标签: sql sql-server-2008

原始陈述是:

Select
     A.a,
     B.b
FROM
     A,
     B
WHERE
     A.c = B.C

我添加了这个并获得了200多万行:

Select
     A.a,
     B.b,
     C.d
FROM
     A,
     B,
     C
WHERE
     A.c = B.C
     AND
     C.c = A.c

我想要添加的表C只有55,000行,而其他两个表要大得多。

4 个答案:

答案 0 :(得分:6)

你正在获得跨产品,而不是真正的加入。这非常昂贵。

我建议将其重写为:

select a.a, b.b, c.d
from a
join b on a.c = b.c
join c on c.c = a.c

它会明显更快,并且可能会为您提供所需的结果。

答案 1 :(得分:5)

听起来你不小心产生了一点cartesian product。似乎某些表具有多个具有相同C值的行,并且您正在获得重复项。看看每个表中C的唯一性。

我使用更清晰,更明确的新样式连接语法重写它:

SELECT A.a, B.b, C.d
FROM A
JOIN B on A.c = B.c
JOIN C on A.c = C.c

答案 2 :(得分:1)

使用连接语法时

FROM A, B, C

您的结果集将是

的产物

来自C *行的B *#行的A *#行中的行

因此,如果每个表有1000行,那么结果集将有1,000,000,000行

答案 3 :(得分:-1)

嗯......我不确定你要做什么,但你很想做这样的事情,所以C.c也会匹配B.C ......看下面的代码:

Select
     A.a,
     B.b,
     C.d
FROM
     A,
     B,
     C
WHERE
     A.c = B.C
     AND
     C.c = A.c
     AND
     C.c = B.C

您的代码正试图单独加入B,C和A.