0

TAB_A と TAB_B の 2 つのテーブルがあります。TAB_A はマスター テーブルで、TAB_B は子/トランザクション テーブルです。TAB_A には COL_A (主キー) があり、TAB_B には COL_B (主キー) と COL_A があります。

業務上の理由により、列 COL_A の TAB_A と TAB_B の間に外部キーが定義されていません。

TAB_B には 4 つのレコードがあり、COL_A には 1、2、3、4 などの値があり、TAB_A の COL_A には対応する一致する値がありません。(これらは、誤って作成された孤立したレコードです)

次の SELECT クエリを発行すると、4 つのレコードが取得されます

SELECT B.COL_B,
       B.COL_A
  FROM TAB_A A,
       TAB_B B
 WHERE A.COL_A = B.COL_A
   AND B.COL_A IN (1, 2, 3, 4)

しかし、クエリで A.COL_A を参照し始めると、SELECTレコードが返されません。

SELECT B.COL_B,
       B.COL_A,
       A.COL_A
  FROM TAB_A A,
       TAB_B B
 WHERE A.COL_A = B.COL_A
   AND B.COL_A IN (1, 2, 3, 4)

誰かがこの奇妙な動作を説明できますか?

AIX の DB2 バージョン 9.5

4

4 に答える 4

1

どちらのクエリも同じ行を返す必要があります。これが実際に説明どおりに動作する場合は、DB2 にバグが見つかりました。

このクエリで何を達成しようとしていますか? B.COL_A の値 (1、2、3、4) が​​孤立レコードである場合、このクエリは行を返しません。孤児を検索するつもりなら、おそらく何らかの外部結合を行う必要があります。

于 2008-11-03T20:30:58.087 に答える
0

IBMサイトのドキュメントを見ました。彼らは「JOIN」の使用について話していますが、「WHERE」条件(私が使用したもの)を使用した直接結合の使用についても言及しており、同じ結果が得られるはずであると述べています。

また、以前は Oracle と SQL Server で働いていました。上記の構文は問題なく機能しました。SELECT 句に追加の列が追加されているため、出力が異なる理由はまだわかりません

于 2008-10-31T14:21:11.610 に答える
0

内部結合では、WHERE 句の代わりに ON 句を使用する必要があります。ON 句は実際の結合に関連していますが、WHERE は通常、結合に関連しない追加の条件に使用されます。

IBM は次のように述べています。「結合条件は ON キーワードの後に​​指定され、結合結果を生成するために 2 つのテーブルを比較する方法を決定します [...] 実際の結合に関連しない追加条件は、 WHERE 句または ON 句の実際の結合の一部として。"

あなたの例では反対のことをしているようで、結合条件を WHERE 句に入れています。私の知る限り、これは違法ではありませんが、テーブルの 1 つの列のみを参照する SELECT 句と一緒に使用すると、この奇妙な動作を説明できます。

于 2008-10-31T09:27:05.700 に答える