2011-02-04 4 views
1

元の文は次のとおりです。SQL:なぜ私は突然この声明から200万行を増やしていますか?

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

私はこれを追加してもらう200万以上の行:

は、テーブルのCIを追加しようとしています
Select 
    A.a, 
    B.b, 
    C.d 
FROM 
    A, 
    B, 
    C 
WHERE 
    A.c = B.C 
    AND 
    C.c = A.c 

は、他の2つのテーブルがずっとあるとしてのみ55,000行です大きい。

+1

テーブル定義を追加します –

+2

古いスタイルの結合構文を削除し、最後にth ANSI JOIN - INNER JOIN、LEUT OUTER JOINなど –

答えて

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 
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

HMを...私はあなたがやろうとしているのかわからないですが、あなたはprollyのような何かをしたいですこのようにCcを以下のコードに見える...あまりにもBCに一致します。

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に参加しようとしています。

1

あなたが結合構文を使用

FROM A, B, C 

結果セットは、C

からそうだとすれば、行ののB *#から行の*番号から

行の製品となります各テーブルには1000の行があります。結果セットには1,000,000,000の行があります

+0

指定されたWHERE句が無視されました。デカルト製品は、結合に制約がない場合にのみ発生することが保証されています –

+0

true ...しかし、より多くの行の理由は、デカルト積が原因です。なぜ起こったのか分かりません... – Leslie

関連する問題