我希望即使違反了ELF表的JOIN條件,也要顯示ROPT表中的所有記錄。Oracle:如何創建一個大外連接
SELECT 1
FROM conf_raggr_opztar ropt,
tar_opzioni_tariffarie opt,
conf_raggruppamenti_forn rgf,
conf_forniture_rel_ragg forg,
conf_forniture forn,
conf_elementi_fatturabili elf,
tar_voci_fatturabili vof,
base_fasce_orarie fas
WHERE ropt.opt_opzione_tariffaria_id = opt.opt_opzione_tariffaria_id
AND rgf.rgf_raggruppamento_forn_id = ropt.rgf_raggruppamento_forn_id
AND forg.rgf_raggruppamento_forn_id = rgf.rgf_raggruppamento_forn_id
AND forg.forn_fornitura_id = forn.forn_fornitura_id
AND forn.forn_fornitura_id = 'QJlXmOFZPF3eAlAG'
AND elf.ROPT_RAGGR_OPZTAR_ID(+) = ropt.ropt_raggr_opztar_id
AND elf.COID_CONTRATTUARIO_ID(+) = ropt.COID_CONTRATTUARIO_ID
AND elf.ROPT_DATA_INI(+) = ropt.ROPT_DATA_INI
AND elf.edw_partition = forn.EDW_PARTITION
AND elf.elf_flag_ann(+) = 'N'
And elf.ELF_DATA_VER_FIN = to_date('31/12/9999','DD/MM/YYYY')
AND elf.VOF_VOCE_FATTURABILE_ID = vof.VOF_VOCE_FATTURABILE_ID
AND fas.FAS_FASCIA_ORARIA_ID = elf.FAS_FASCIA_ORARIA_ID
ORDER BY ELF_VERSIONE desc;
* ANSI JOIN VERSION(它就像第一個)
SELECT 1
FROM CONF_RAGGR_OPZTAR ropt
INNER JOIN TAR_OPZIONI_TARIFFARIE OPT
ON (ropt.OPT_OPZIONE_TARIFFARIA_ID = opt.OPT_OPZIONE_TARIFFARIA_ID)
INNER JOIN CONF_RAGGRUPPAMENTI_FORN rgf
ON (rgf.RGF_RAGGRUPPAMENTO_FORN_ID = ropt.RGF_RAGGRUPPAMENTO_FORN_ID)
INNER JOIN CONF_FORNITURE_REL_RAGG forg
ON (forg.RGF_RAGGRUPPAMENTO_FORN_ID = rgf.RGF_RAGGRUPPAMENTO_FORN_ID)
INNER JOIN CONF_FORNITURE forn
ON (forg.FORN_FORNITURA_ID = forn.FORN_FORNITURA_ID)
LEFT OUTER JOIN CONF_ELEMENTI_FATTURABILI elf
ON (elf.ROPT_RAGGR_OPZTAR_ID = ropt.ROPT_RAGGR_OPZTAR_ID AND
elf.COID_CONTRATTUARIO_ID = ropt.COID_CONTRATTUARIO_ID AND
elf.ROPT_DATA_INI = ropt.ROPT_DATA_INI AND
elf.EDW_PARTITION = forn.EDW_PARTITION)
-- LEFT OUTER JOIN TAR_VOCI_FATTURABILI vof
-- ON (elf.VOF_VOCE_FATTURABILE_ID = vof.VOF_VOCE_FATTURABILE_ID)
-- LEFT OUTER JOIN BASE_FASCE_ORARIE fas
-- ON (fas.FAS_FASCIA_ORARIA_ID = elf.FAS_FASCIA_ORARIA_ID)
WHERE forn.FORN_FORNITURA_ID = 'QJlXmOFZPF3eAlAG' AND
elf.ELF_FLAG_ANN = 'N' AND
elf.ELF_DATA_VER_FIN = TO_DATE('31/12/9999','DD/MM/YYYY')
ORDER BY ELF_VERSIONE DESC;
無論你有精靈。如果條件不滿足,您需要附加(+)以獲得空記錄。 [採用ansi連接語法會對你有好處,因爲它會使這種錯誤更加清晰。 – 2012-08-06 09:19:38
問題是oracle「說ORA-01417:一個表可能被外連接到最多一個其他表」。這是問題:AND elf.edw_partition(+)= forn.EDW_PARTITION – Revious 2012-08-06 09:47:00
使用'LEFT JOIN'代替'(+)'。我認爲這沒有這個限制。 – 2012-08-06 10:20:31