-2
Table a    Table b   result
id name    id name   id name
1  a1      1  b1     1  b1
2  a2      2  b2     2  b2
3  a3                1  b1
4  a4                2  b2
                     1  b1
                     2  b2
                     1  b1
                     2  b2

このようなクエリを実行すると、2つのテーブルaとbがあります

SELECT b.* FROM a As a,b AS b

、デカルト積がありますが、わかりません、このステートメントはテーブル b からのみデータを選択しますが、なぜ

として

最終結果を変更しましたか?IMO テーブル a は結果とは関係がなく、意味がありません

4

4 に答える 4

2

2 つのテーブルをリンクする列を指定しなかったためです。あなたは何を得ることを期待していますか?デカルトの結果を作成したくない場合は、次のようなクエリを作成します。

SELECT b.* 
FROM a As a, b AS b
WHERE a.columnname = b.columnName
于 2013-09-25T15:56:47.387 に答える
2

エイリアスを使用しても効果はありません。つまり、次の 2 つのクエリは同一です。

SELECT b.* FROM a AS a, b AS b
SELECT b.* FROM a, b

これで、クエリは期待どおりに動作します。b の行は、a の行ごとに 1 回出力されます。つまり、デカルト積をコーディングしました。

あなたの質問について不思議なことは何もありません。

于 2013-09-25T16:01:04.513 に答える
2

このselect句は行をフィルタリングしません。それは単なる値の投影です。where行は、句または句のon一部でフィルタリングされjoinます。

あなたが言ったことは次のとおりです。

  1. テーブル a のすべての行とテーブル b のすべての行を取得します (from節、デカルト セットを生成します)
  2. where(存在しない)述語(またはon句)に従ってそれらの行をフィルタリングします
  3. これらの結果行のうち、b テーブルからのフィールドのみを表示します。(select節)
于 2013-09-25T16:01:12.300 に答える
2

table から列を指定ない場合a、これは予想される動作です...

SELECT a.*, b.* FROM a As a,b AS b

またはより簡単に:

SELECT * FROM a,b

デカルト積を求める場合は、おそらく必要なものです。

編集 It defaults to select all columns from table a if I don't write a.*?It is by default?

いいえ。を使用SELECT b.* FROMしました。つまり、 table から取得されたすべての列を教えてくださいb。は、テーブルとSELECT a.*, b.*から来るすべての列を教えてくれることを意味します。どこから来たかに関係なく、すべての列を私に与えることを意味します...abSELECT * FROM

于 2013-09-25T15:56:16.067 に答える