Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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:为什么我突然从这个语句中多得到了200万行?_Sql_Sql Server 2008 - Fatal编程技术网

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连接等。