Business Objects によって生成され、「昔ながらの」暗黙的な結合構文を使用するクエリを書き直しています。このコードは、1 つの部分でテーブルをそれ自体に結合し、「グローバル」where 句も備えています。例えば:
select a.col1
, b.col2
from MYDB.TABLE a, MYDB.TABLE b
where a.something=b.something_else
and MYDB.TABLE.source='A'
上記は、質問の構成図です。実際のクエリは非常に長く、約 10 個のテーブルを結合しています。
私の質問: 上記のように、「余分な」場所条件は同じテーブルの両方のインスタンスに適用されますか? はいと思いますが、このようなコードはこれまで見たことがありません。Teradata を使用していますが、これは一般的な SQL の質問だと思います。
更新: おそらく、質問を絞り込もうとした私の試みは正確ではありませんでした。変更しようとしている完全なクエリは次のとおりです。
SELECT
abs_contrct_prof.contrct_nbr_txt,
gbs_org_LVL1.bus_pln_sgmnt_cd,
abs_gnrc_lst_of_val_LVL1.wirls_val_1_txt
FROM
EDWABSUSERVIEWS.abs_contrct abs_contrct_prof,
EDWABSUSERVIEWS.gbs_org gbs_org_LVL1,
EDWABSUSERVIEWS.abs_gnrc_lst_of_val abs_gnrc_lst_of_val_LVL1,
EDWABSUSERVIEWS.abs_contrct,
EDWABSUSERVIEWS.gbs_sls_actv_blng_org_rltd,
EDWABSUSERVIEWS.gbs_sls_actv_org_rltd
WHERE
( abs_contrct_prof.type_cd = 'PROFILE' )
AND ( EDWABSUSERVIEWS.abs_contrct.type_cd = 'AGREEMENT' )
AND ( abs_contrct_prof.prnt_contrct_id=EDWABSUSERVIEWS.abs_contrct.contrct_id )
AND ( abs_contrct_prof.org_id=EDWABSUSERVIEWS.gbs_sls_actv_org_rltd.org_id )
AND ( EDWABSUSERVIEWS.gbs_sls_actv_org_rltd.gbs_lvl_3_org_id=EDWABSUSERVIEWS.gbs_sls_actv_blng_org_rltd.gbs_lvl_3_org_id )
AND ( EDWABSUSERVIEWS.gbs_sls_actv_blng_org_rltd.gbs_lvl_1_org_id = gbs_org_LVL1.org_id )
AND ( gbs_org_LVL1.bus_pln_sgmnt_cd=abs_gnrc_lst_of_val_LVL1.nm_txt and abs_gnrc_lst_of_val_LVL1.actv_ind = 'Y' and abs_gnrc_lst_of_val_LVL1.type_cd ='ABS_MOBILITY_SEGMENT' )
AND
abs_contrct_prof.contrct_nbr_txt IN @variable('FAN')
AND ( EDWABSUSERVIEWS.abs_contrct.sts_cd = 'Active' )
AND ( EDWABSUSERVIEWS.abs_contrct.type_cd='AGREEMENT' )
テーブルEDWABSUSERVIEWS.abs_contrct
は FROM 句で 2 回参照されていることに注意してください。1 回はエイリアスを使用し、もう 1 回はエイリアスを使用していません。はい、このクエリは書かれたとおりに機能しますが、明示的な結合構文を使用するように書き直したいと思います(誰かがコメントしたように)。
クエリで EXPLAIN を実行したところ、「追加の」条件 (「Active」と「AGREEMENT」の場合) が実際にはテーブルの両方のインスタンスに個別に適用されているようです。