Existe uma maneira de implementar a operação (vamos anotá-la ∘) que se comporta como junção cruzada regular, exceto para conjuntos vazios, ela retorna o lado não vazio.
∘ - new operation
x - cross join
{} - empty result set
A ∘ B = A x B
A ∘ {} = A
{} ∘ B = B
{} ∘ {} = {}
As colunas de A e B diferem e não estão vazias.
Isso funcionará para você?
Se por conjunto vazio, você quer dizer "que tem coluna zero", então
CROSS JOIN
com um SELECT vazio já faz isso:Observe que a seleção vazia (sem coluna) é uma adição relativamente recente no PostgreSQL. Em versões mais antigas, a consulta acima causará um erro de sintaxe.
Outra interpretação da questão poderia ser que em
A ∘ {}
, A é um tipo de tabela com certas colunas e{}
é um tipo de tabela arbitrariamente diferente com colunas diferentes, mas que contém 0 linha. Nesse caso não haverá operação em SQL que satisfaça a pergunta, pois o tipo de resultado de uma consulta não pode depender do conteúdo das relações. Deve sempre depender apenas das definições das relações envolvidas, para que possa ser determinada sem realmente executar a consulta.