0

これは仕事で出てきました、そしてこれは本当にパズルのようです...

クエリ1:

SELECT * FROM
SYSIBM.SYSTABLES A LEFT JOIN
SYSIBM.SYSTABLESPACE B
ON A.DBNAME = B.DBNAME
AND A.TSNAME = B.NAME
AND A.TSNAME LIKE 'HIB%'
;

HIB%このクエリは、クエリが実行する必要があるように見えるのとは異なり、基準をフィルタリングしません。その基準をに入れると、JOIN同じ結果が得られるはずだと思います。

クエリ2は期待どおりに機能します。

SELECT * FROM
(SELECT * FROM SYSIBM.SYSTABLES
WHERE TSNAME LIKE 'HIB%') A
LEFT JOIN
SYSIBM.SYSTABLESPACE B
ON A.DBNAME = B.DBNAME
AND A.TSNAME = B.NAME
;

最初のクエリの何が問題になっていますか?

4

2 に答える 2

4

試す

SELECT * FROM SYSIBM.SYSTABLES A 
LEFT JOIN SYSIBM.SYSTABLESPACE B 
  ON A.DBNAME = B.DBNAME AND A.TSNAME = B.NAME 
WHERE A.TSNAME LIKE 'HIB%' ; 

結合のレコードをフィルタリングするために使用される左結合に条件を設定すると、左結合であるため、条件を設定しないため、テーブルAからすべてのレコードが返されます。

これで、条件がテーブルBにある場合は異なります。これは、左側の結合に属します(B.idがnullのようなものでない限り)。そうでない場合は、クエリを内部結合に戻します。

于 2012-07-20T15:15:34.550 に答える
2

「Like」部分をwhere句に移動しようとしましたか?

SELECT * 
FROM SYSIBM.SYSTABLES A 
LEFT JOIN SYSIBM.SYSTABLESPACE B ON A.DBNAME = B.DBNAME AND A.TSNAME = B.NAME
WHERE A.TSNAME LIKE 'HIB%'
;
于 2012-07-20T15:14:34.597 に答える