0

これら2つのクエリに違いはありますか?

クエリ 1:

select a.idclientecrm from clientescrmporlistadeclientescrm a
inner join clientescrmporlistadeclientescrm b on (a.idclientecrm=b.idclientecrm and            a.idlistadeclientescrm = 58)
inner join tareas c on b.idclientecrm = c.idclientecrm
where b.idlistadeclientescrm = 70

クエリ 2:

select a.idclientecrm from clientescrmporlistadeclientescrm a
inner join clientescrmporlistadeclientescrm b on (a.idclientecrm=b.idclientecrm and   a.idlistadeclientescrm = 58)
where b.idlistadeclientescrm = 70

最初のものには「tareas」テーブルに追加の内部結合があることは知っていますが、それが別の結果になるとは知りませんでした。誰でも理由を教えてもらえますか?

編集:

このクエリの結果に参加しようとしています:

select a.idclientecrm from clientescrmporlistadeclientescrm a
inner join clientescrmporlistadeclientescrm b on (a.idclientecrm=b.idclientecrm and   a.idlistadeclientescrm = 58)
where b.idlistadeclientescrm = 70

「tareas」と呼ばれる別のテーブルを使用します。そこからは最大日付のみが必要です。各 idclientecrm に複数の日付を指定できます。「tareas」テーブルには、テーブルを結合するための idclientecrm フィールドがあります。

理解できることを願っています。

前もって感謝します!

4

2 に答える 2

3

クエリが同じ結果になる唯一の方法は、tareas結合がすべてのレコード (前の from..inner 結合セット内)に正確に 1 回一致した場合です。

最初のクエリの結果がより多くの行になる場合tareas、結合述語ごとに重複するレコードが含まれます (つまり、重複するidclientecrm値があります)。これが、同じ結果セットに対してレコードが1 回だけ一致する必要がある理由です。(これが 1 対 1 の関係を意図していた場合、いくつかの制約が正しく設定されていませんでした..おっと!)

異なる多重度の結果を示す次の簡単な内部結合の例を考えてみましょう。

A <- { 1, 2, 4 }
B <- { 1, 2(#1), 2(#2), 3 }

A join B => { 1, 2(#1), 2(#2) }

結果の理由:

  • A.1 一致 B.1 - これは、1 回だけ一致した唯一のレコードです。
  • A.2 マッチ B.2(#1)
  • A.2 マッチ B.2(#2)
  • A.4 一致しない
  • B.3 一致しない

ウィキペディアからのこの抜粋は、概念をよく説明していると思います。

結合の結果は、最初にテーブル内のすべてのレコードのデカルト積 (クロス結合) を取得した結果として定義できます (テーブル A のすべてのレコードとテーブル B のすべてのレコードを組み合わせます) 。次に、条件を満たすすべてのレコードを返します。述語を結合します。

(これが、WHERE を使用した CROSS JOIN が INNER JOIN と同じ結果を返す理由です。

于 2013-05-13T19:59:21.280 に答える
0

内部結合とは、左側のテーブルの各行に対して、右側のテーブルの一致するすべての行を返すことを意味します。右側のテーブルに一致しない行を返さないでください。

そのため、新しいテーブルを結合すると、返される行の数を減らすことも増やすこともできます。

  • 新しい結合は一致しない行を除外するため、減らす
  • 新しい結合により、左側のテーブルの行ごとに複数の行が追加される可能性があるため、増加します。これは、複数の右側の行が左側の行と一致する場合に発生します。
于 2013-05-13T20:01:18.833 に答える