2

次の列を含むテーブルがあります。a、b、e、および c、d を含む別のテーブル table2。どちらのテーブルにも列がありますname

私はクエリを作成しました:

SELECT distinct a, b
from db.table
where e <>'65';

1885 レコード

次に、別のテーブル (c、d) からさらに情報が必要でした。これらの追加情報を取得するために、内部結合を使用しました。クエリは次のようになります。

SELECT distinct a, b, c, d 
from db.table
inner join db.table2
on table.name=table2.name2
where e <>'65';

今、私は同じ結果を期待していましたが、追加の列(c、d)があります。しかし、結果の数が異なりました: 51144.列を追加しただけで条件を変更しなかったのに、なぜ数が増えたのか説明してもらえますか?

4

5 に答える 5

1

これはデカルト積ONと呼ばれ、実際には結合条件をより正確にする必要があることを意味します。

テーブルの各行ごとtable2に条件に一致するレコードが 1 つだけテーブルに含まれている場合にのみ、同じ結果が可能です。table.name=table2.name2table

于 2012-08-15T04:55:02.050 に答える
1

INNER JOINONは、両方のテーブルの指定された列 (条件で使用される) の同じ値に一致する結果のみを返します。

于 2012-08-15T04:57:35.460 に答える
0

驚くべきことは何ですか?select ステートメントと別のテーブルにさらに 2 つの列が追加されました。

たとえば、distinct は繰り返されない 4 つの列 (a、b、c、d) に適用されます。

あなたがテーブルならこのようなものです

A B C D E
1 2 1 1
1 2 3 4
1 2 4 5
1 2 4 5

最初のステートメントは、1,2 のみである個別の A、B を選択します。2 番目のステートメントは、条件 e <> 65 を満たす限り、1,2,1,1 - 1,2,3,4 - 1,2,4,5 を選択します。

残りについては、選択に関してより具体的にするためにONを使用する必要があります。

于 2012-08-15T04:57:36.210 に答える
0

DISTINCT は、キーワードが示すように、select から個別の結果を返します。

個別の選択に追加の列を追加しているという事実により、個別の結果セットがより多くの行になる可能性があります。例を見てみましょう

とは異なる

A   B
1   2
1   3
1   2

だろう

A   B
1   2
1   3

しかし、これに列を追加するとします。

A   B   C
1   2   1
1   3   2
1   2   3

結果として

A   B   C
1   2   1
1   3   2
1   2   3

さらに、内部結合は table1 と table2 の両方にある値のみを返すため、内部結合は結果セットを制限することができます。

または、@zerkms が言及したように、2 つのテーブル間の関係を定義する 2 つのキーがある場合、期待以上の結果が得られる可能性があります。

于 2012-08-15T04:58:47.523 に答える
0

これは、DISTINCTキーワードが行全体に適用されるためです。

この結果があるとします:

a       b        c         d
=====================================
1       1        1         1
1       1        3         2
1       1        4         2
1       2        5         2
1       2        6         6
1       3        1         1

を適用すると、次のようDISTINCT a, bになります。

a       b     
==============
1       1             
1       2      
1       3    

レコードのうちの 2 つが と重複していたためです1, 1。と言うと、すべてのレコードが返されますDISTINCT a, b, c ,d

クエリが複数のレコードを返すもう 1 つの理由は、 のレコードが のレコードにtableA対応する多数の一致を持っている可能性があるためですtableBtableAレコードが 1 つしかないが、そのtableBレコードには対応する 5 つのレコードの一致があるとします。tableA からの 1 つのレコードではなく、テーブルを結合しようとすると5 rows、一致したために返されるはずです。

于 2012-08-15T04:59:01.087 に答える