3

PHP pageとつながることに取り組んでいますOracle。私はこのSQLに出くわしましたが、それが想定されていることを行っているかどうかわからないので、ここで質問しようと思いました. 問題の SQL は次のようなものです。

select tableA.id, tableA.name, tableB.details 
from tableA
left join tableB on
tableB.id = tableA.id
and 
tableB.logId = '<logged_in_user>'

tableB にエントリを持たないユーザーとしてログインすると、このクエリの実行時にまだレコードが取得されます。そして、私の仮説は'and'、句の代わりに'where'.

left join tableB on
    tableB.id = tableA.id
    where
    tableB.logId = '<logged_in_user>'

だから私の2つの質問はです。

  1. 私は正しいですか?
  2. もしそうなら、なぜクエリは結果を返すのでしょうか? 'and'条項チェックとは何ですか?

上記のクエリで AND と WHERE を使用した場合の違いを誰か説明できますか?

前もって感謝します!

4

3 に答える 3

9

私は正しいですか?

いいえ。このクエリ:

select tableA.id, tableA.name, tableB.details 
from tableA
left join tableB
on tableB.id = tableA.id
and tableB.logId = '<logged_in_user>'

次のものとは大きく異なります。

select tableA.id, tableA.name, tableB.details 
from tableA
left join tableB
on tableB.id = tableA.id
where tableB.logId = '<logged_in_user>'

入会の基準です。

最初のケースでは、A から取得し、一致する IDとlogIdがある場合は B と結合し、そうでない場合は詳細を null のままにします。

2 番目では、A から取得し、一致する ID がある場合は B と結合し、それ以外の場合は詳細を null のままにして、logId を持つ B の一致がある A からの行のみを保持します。プロセスで A からの行を削除します。 、そして事実上それを内部結合に変えます。

于 2013-05-06T14:16:29.357 に答える
2

両方のテーブルの値を含む結果のみが必要な場合、本当に必要なのは内部結合です。それができたら、どこで結果をフィルタリングするかは問題ではありません。

于 2013-05-06T14:15:20.037 に答える
2

tableB にエントリを持たないユーザーとしてログインすると、このクエリの実行時にまだレコードが取得されます。

inner join次のように使用するようにクエリを変更するだけです。

select tableA.id, tableA.name, tableB.details 
from tableA
inner join tableB ...

left joinそして、ここにオラクルからの定義があります:

LEFT JOIN (LEFT OUTER JOIN とも呼ばれる) キーワードは、右側のテーブル (table_name2) に一致する行がない場合でも、左側のテーブル (table_name1) からすべての行を返します。

一方、の定義inner joinは次のとおりです。

INNER JOIN キーワードは、両方のテーブルに少なくとも 1 つの一致がある場合に行を返します。

于 2013-05-06T14:15:30.317 に答える