Как использовать SQL слияния с нулевой целой выбранной строкой - PullRequest
0 голосов
/ 05 октября 2018

Случай, который я пытаюсь решить, состоит в следующем: для каждой строки в таблице может существовать другая строка из второй таблицы, поэтому мне нужны все данные из строки первой таблицы и данные из строки второй таблицыесли присутствует.

Я знаю, что могу использовать структуры данных в качестве переменных хоста для сбора всех данных из строки в таблице.Итак, мой выбор такой:

select
    t1.*
   ,t2.*
into
    :dst1
   ,:dst2
from table1 t1
  left join table2 t2 on t2.key=t1.key
;

, где dst1 и dst2 - структуры данных соответственно, такие как формат записей table1 и table2.Довольно просто.

Теперь дело в том, как отловить нулевой результат, когда строка для этого ключа не существует во второй таблице.В этом случае я хотел бы инициализировать соответствующую структуру данных, но объединение работает на одном поле за раз, и я не смог найти другое решение.

Есть ли способ получить этот результат?

Буду признателен за любую помощь!

Спасибо

1 Ответ

0 голосов
/ 05 октября 2018

Один из способов справиться с этим - использовать переменные индикатора.Это выглядит следующим образом:

dcl-ds hs    Qualified;
  field1 ...
  field2 ...
endds;

dcl-s hsind  Int(5) Dim(2);

exec sql
  select *
    into :hs:hsind
    from table
    fetch first row only;

Обратите внимание, что между: hs и: hsind нет запятой (,), поскольку это является частью одного и того же присвоения переменной.: hsind - переменная индикатора, и в этом случае это массив Int(5) с тем же количеством элементов, что и у структуры данных хоста: hs имеет поля.Переменная индикатора будет содержать 0, если значение в соответствующем поле в: hs хорошее, или -1, если оно нулевое.Итак, в нашем примере выше: если hs.field1 - это хорошо, а hs.field2 - это ноль, то hsind (1) = 0 и hsind (1) = -1.Другие значения означают другие вещи, такие как ошибка отображения данных (-2) или усечение строки (положительное число с исходной длиной строки).

Так что в вашем примере используйте что-то вроде этого:

select
    t1.*
   ,t2.*
into
    :dst1:dst1ind
   ,:dst2:dst2ind
from table1 t1
  left join table2 t2 on t2.key=t1.key
;

Где dst1ind - массив, если Int (5) с тем же количеством элементов, что и dst1, имеет подполя, аналогично для dst2ind.Затем после вашего выбора просто отметьте dst2ind(1) >= 0, и у вас есть хороший выбор.Обратите внимание, что вам нужно убедиться, что select into возвращает только одну строку, иначе вы получите ошибки об этом.

...