Курсор PL / SQL выбирает уникальную запись и печатает в плоском файле - PullRequest
0 голосов
/ 01 декабря 2010

У меня есть набор значений в курсоре. Например:

CURSOR c_stock_option IS
SELECT empid, '1' AS ISenrolled
FROM employee emp
UNION ALL
SELECT empid, '2' AS ISenrolled
FROM employee emp;

Теперь я хочу проверить, появляется ли empid как при первом выборе (where ISenrolled =1), так и при втором выборе (where ISenrolled =2). Я хочу только получить значение с первого выбора where enroll=1 и отклонить одно where enroll=2. Я хочу печатать только те записи, которые соответствуют этим критериям.

FOR v_stock_option_record IN c_stock_option LOOP
    IF v_esppstock_recs  IN (v_stock_option_record.empid) THEN

    END IF;
    -- Participant file.
    v_member_string_1 := v_stock_option_record.empid || G_DELIMITER || --1. participant id
    v_stock_option_record.last_name || G_DELIMITER || --4. Last Name
    v_stock_option_record.first_name || G_DELIMITER || --5. First Name
END loop;

В первой части запроса выбираются все сотрудники, которые приобрели акции (что даст только набор сотрудников, которые приобрели акции, другая часть запроса дает всех активных сотрудников в компании, поэтому сотрудник, который находится в первой части выбора, всегда будет во второй части выбора, но сотрудник, который находится во второй части выбора, не обязательно находится в первой части. В сценарии, когда сотрудник появляется в обеих частях, я нужно просто выбрать сотрудника, который isenrolled = 1). Ниже приведен SQL для дифференциации

SELECT
    empid,
    '1' AS ISenrolled
    FROM employee emp,
    hrempusf usf
    where emp.employee = usf.employee
          AND usf.field_key = 76 ---- 76 determines that employee has purchased stocks
UNION ALL
    SELECT
     empid,
    '2' AS ISenrolled
     FROM employee emp;

Ответы [ 2 ]

1 голос
/ 02 декабря 2010

Вам не нужен сложный PL / SQL для этого, вам просто нужно СЛЕДУЮЩЕЕ ВНЕШНЕЕ СОЕДИНЕНИЕ.Это вернет все записи EMPLOYEE, независимо от того, соответствует ли она записи HREMPUSF.

SELECT
     empid
     , nvl2(usf.field_key ,'1', '2') AS ISenrolled
  FROM employee emp
     left outer join hrempusf usf
          on ( usf.employee = emp.employee
              and usf.field_key = 76 )

NVL2 () возвращает второе значение, если первый аргумент не равен нулю, и третий аргумент, если он равен нулю.

0 голосов
/ 01 декабря 2010

Вот один из способов, который должен работать, он вернет 1 => IsEnrolled, если он существует, в противном случае он вернет 2 IsEnrolled.

«Данные» должны имитировать ваши дваоператоры выбора.

with data as(
select 1 empId, 1 ISEnrolled from dual
union
select 2 empId, 1 ISEnrolled from dual
union
select 3 empId, 1 ISEnrolled from dual
union
select 4 empId, 1 ISEnrolled from dual
union
select 5 empId, 1 ISEnrolled from dual /** these 5 are mimicing your first select */
union
select 1 empId, 2 ISEnrolled from dual /** the next are the 'all' */
union
select 2 empId, 2 ISEnrolled from dual
union
select 3 empId, 2 ISEnrolled from dual
union
select 4 empId, 2 ISEnrolled from dual
union
select 5 empId, 2 ISEnrolled from dual
union
select 6 empId, 2 ISEnrolled from dual
union
select 7 empId, 2 ISEnrolled from dual
union
select 8 empId, 2 ISEnrolled from dual
union
select 9 empId, 2 ISEnrolled from dual
union
select 10 empId, 2 ISEnrolled from dual)
,
onlyOneIsEnrolled as (
  select empId, isEnrolled
    from data
    where isEnrolled = 1
) ,
notInOneIsEnrolled as(
  select empId, isEnrolled
    from data d
    where not exists(select null
                           from onlyOneIsEnrolled ooie
                            where ooie.empid = d.empId
                            )
)
select EmpId, isEnrolled
  from onlyOneIsEnrolled
  union
select EmpId, isEnrolled
  from notInOneIsEnrolled
order by isEnrolled, EmpId

Это всего лишь один из способов выполнить задачу: onlyOneIsEnrolled собирает все 1, а затем notInOneIsEnrolled получает все emps, не указанные выше, заключительную частьзапрос объединяет их.

Есть много способов выполнить эту задачу, это использует CTE , но в зависимости от ваших потребностей вы можете сделать это без использования withпункт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...