Соединение влево, если значение равно NULL, в противном случае внутреннее соединение

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

Без использования разреза:

deleteLastElement([_], []).
deleteLastElement([Head, Next|Tail], [Head|NTail]):-
  deleteLastElement([Next|Tail], NTail).

Первое предложение (базовый регистр) объединяет второй аргумент с пустым списком, когда в списке первых аргументов есть только один элемент.

В втором предложении указано, что когда первый аргумент представляет собой список с хотя бы двумя элементами, то вы рекурсивно называете себя (без head), добавьте Head во второй аргумент, возвращенный этим вызовом.

На самом деле вам не нужно делать явным во втором предложении, что в списке должно быть как минимум два элемента,

deleteLastElement([Head|Tail], [Head|NTail]):-
  deleteLastElement(Tail, NTail).

И, конечно, вы также могли бы использовать append/3 для удаления последнего элемента из списка:

append(WithoutLast, [_], List).
0
задан Charlie 16 January 2019 в 02:40
поделиться

1 ответ

Вы можете использовать это:

SELECT t1.val, t2.val
FROM t1
LEFT JOIN t2
ON t1.val = t2.val 
WHERE t1.val IS NULL OR t1.val = t2.val;

Или:

SELECT NULL AS val1, NULL AS val2
FROM t1 
WHERE val IS NULL 
UNION ALL 
SELECT t2.val, t2.val 
FROM t2
INNER JOIN t1 ON t1.val = t2.val;
0
ответ дан Pham X. Bach 16 January 2019 в 02:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: