0

我有这个查询:

 select w.worker_id,   w.lastname,pd.invalid
                             from workers w,personal_data pd
                             where pd.worker_id (+) = w.worker_id
                             and nvl(pd.invalid,'N')='Y'

我有复选框(y,n),该复选框的目的是获取无效列表,如果它被选中并且当它没有与包括无效的正常工作人员一起检查时。有了这个我总是得到无效的列表。

有了这个选择:

  select w.worker_id,   w.lastname,pd.invalid
                                 from workers w,personal_data pd
                                 where pd.worker_id (+) = w.worker_id
                                 and pd.invalid =nvl(:p_invalid,pd_invalid)

如果复选框是 Y,我会得到无效的工人,而当未选中(n)时,我得到的只是普通工人,我需要得到 N 个所有工人(无效和正常)的时间。

4

1 回答 1

2

停止使用(+)语法!使用正确的、显式的外连接。

但是,我认为您不需要外部连接——您与常量的比较无论如何都会撤消它。我认为这可以满足您的要求:

select w.worker_id, w.lastname, pd.invalid
from workers w join
     personal_data pd
    on pd.worker_id = w.worker_id
where (:p_invalid = 'N' or pd.invalid = :p_invalid);
于 2017-09-12T10:37:38.210 回答