SQL:为什么我突然从这个语句中多得到了200万行?
原来的声明是:SQL:为什么我突然从这个语句中多得到了200万行?,sql,sql-server-2008,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只有55000行,而其他两个表要大得多。您得到的是叉积,而不是真正的联接。
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只有55000行,而其他两个表要大得多。您得到的是叉积,而不是真正的联接。这是非常昂贵的 我建议将其改写为:
select a.a, b.b, c.d
from a
join b on a.c = b.c
join c on c.c = a.c
它将大大加快速度,并可能为您提供所需的结果。您得到的是交叉积,而不是真正的连接。这是非常昂贵的 我建议将其改写为:
select a.a, b.b, c.d
from a
join b on a.c = b.c
join c on c.c = a.c
这将大大加快速度,并可能为您提供所需的结果。听起来您好像意外地产生了一些错误。似乎有些表有多行具有相同的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
听起来好像你不小心产生了一点错误。似乎有些表有多行具有相同的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
嗯。。。我不知道你想做什么,但你很想做这样的事情,这样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分别联接。hm。。。我不知道你想做什么,但你很想做这样的事情,这样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
您的代码正试图分别用A连接B、C。当您使用连接语法时
FROM A, B, C
您的结果集将是
A*#中的行来自B*#中的行来自C
因此,如果每个表有1000行,那么在使用联接语法时,结果集将有100000000行
FROM A, B, C
您的结果集将是
A*#中的行来自B*#中的行来自C
因此,如果每个表有1000行,那么结果集将有100000000行您忽略了指定的WHERE子句。笛卡尔积只有在连接没有约束的情况下才保证发生…但是行数更多的原因是因为笛卡尔积,我只是想分享它发生的原因…您忽略了指定的WHERE子句。笛卡尔乘积只有在Jointure没有约束的情况下才能保证出现…但是行数更多的原因是因为笛卡尔乘积,我只是想告诉大家为什么会出现这种情况…这是放弃旧式联接语法并最终开始使用ANSI联接的-内联接的另一个原因,LEFT-OUTER JOIN等。放弃旧式连接语法并最终开始使用ANSI连接的另一个原因-内部连接、LEFT-OUTER连接等。