IMPLICIT 和 EXPLICIT 连接

IMPLICIT and EXPLICIT join

我正在尝试重写以下代码:

W_WHERE := ' PD.NIF(+) = p.NIF and pd.num_colegiado(+) = p.num_colegiado AND PD.FECHA_INICIO(+) <= SYSDATE 
       AND NVL(PD.FECHA_FIN(+), SYSDATE) >= SYSDATE AND D.ID_DIRECCION(+) = PD.ID_DIRECCION AND p.num_colegiado  = coleg.num_colegiado';

转换成正常的 JOIN 表示法,有人可以帮我吗?

PS。 PD 代表 PERSONA_DIRECCION table,P 代表 PERSONA table

这里没有任何暗示。在 Oracle 中,“(+) =”是一个 "normal JOIN notation"(如您所说)用于外部连接。如果你不想外连接,只需删除 (+)。

请参阅 this SO answer 了解说明。

显式联接的名称来自明确指定您在 table 上使用的联接类型(CROSS JOIN、INNER JOIN、LEFT OUTER JOIN 等)

因此您必须重新编写查询,以便将 FROM 子句中以逗号分隔的 table 替换为显式联接(此处为 INNER JOIN 和 LEFT JOIN)。然后将您的连接条件移动到有问题的 ON 子句:

select ...
from colleg
inner join p on p.num_colegiado  = coleg.num_colegiado
left join pd on pd.nif = p.nif and 
                pd.num_colegiado = p.num_colegiado and 
                pd.fecha_inicio <= sysdate and
                nvl(pd.fecha_fin, sysdate) >= sysdate
left join d on d.id_direccion = pd.id_direccion;