Como fazer uma junção externa completa sem ter uma junção externa completa disponível

StackOverflow https://stackoverflow.com/questions/2089658

  •  21-09-2019
  •  | 
  •  

Pergunta

Na semana passada, fiquei surpreso ao descobrir que o Sybase 12 não suporta junções externas completas. Mas me ocorreu que uma junção externa completa deveria ser a mesma que uma junção externa esquerda unida com uma junção externa direita do mesmo SQL. Alguém pode pensar em uma razão que isso não se aplicaria?

Foi útil?

Solução

UNION-ing dois OUTER JOIN As declarações devem resultar em linhas duplicadas representando os dados que você obteria de um INNER JOIN. Você teria que provavelmente fazer um SELECT DISTINCT no conjunto de dados produzido pelo UNION. Geralmente se você tiver que usar um SELECT DISTINCT Isso significa que não é uma consulta bem projetada (ou assim eu ouvi).

Outras dicas

Se você os unirá com UNION ALL, você receberá duplicatas. Se você apenas usa UNION sem o ALL, ele filtrará duplicatas e, portanto, será equivalente a uma junção completa, mas a consulta também será muito mais cara, porque precisa executar um tipo distinto.

UNION ALL A esquerda junta -se à junção direita, mas limite a junção correta a apenas linhas que não existem na tabela base (retorne nulos na junção quando não seriam nulos na tabela se existissem).

Para este código, você precisará criar duas tabelas T1 e T2. T1 deve ter uma coluna chamada C1 com cinco linhas contendo os valores 1-5. T2 também deve ter uma coluna C1 com cinco linhas contendo os valores 2-6.

Junção externa completa:

select * from t1 full outer join t2 on t1.c1=t2.c1 order by 1, 2;

Junção externa completa equivalente:

select t1.c1, t2.c1 from t1 left join  t2 on t1.c1=t2.c1
union all
select t1.c1, t2.c1 from t1 right join t2 on t1.c1=t2.c1 
where t1.c1 is null
order by 1, 2;

Observe a cláusula WHERE à direita, selecione Selecionar que limita os resultados apenas aos que não seriam duplicados.

  1. Bem, primeiro, não sei por que você está usando 12.x. Era Endoflifado Em 31 de dezembro de 2009, depois de ter sido notificado em 3 de abril de 2007. 15.0.2 (primeira versão sólida) foi lançada em janeiro de 2009. 15.5 é muito melhor e estava disponível em 02 de dezembro de 2009, então você é dois grandes lançamentos e, pelo menos, pelo menos 13 meses, desatualizado.

  2. ASE 12.5.4 tem a nova sintaxe de junção. (Você não especificou, pode estar em 12.5.0.3, a versão antes disso).

  3. DB2 e Sybase não implementaram FULL OUTER JOIN, por precisamente pela razão que você identificou: é coberto por LEFT ... UNION ... RIGHT sem ALL. Não é um caso de "não apoiar" um FOJ; É um caso de palavra -chave está faltando.

  4. E então você tem o problema de que os tipos de Sybase e DB2 geralmente nunca usariam junções externas e muito menos FOJs, porque seus bancos de dados tendem a ser mais normalizados, etc.

  5. Por fim, existe SQL perfeitamente comum que você pode usar em qualquer versão do Sybase que forneça a função do FOJ e será distintamente mais rápida em 12.x; apenas marginalmente mais rápido em 15.x. É como a função Rank (): bastante desnecessária se você pode escrever uma subconsulta.

  6. A segunda razão pela qual não precisa FULL OUTER, como alguns dos motores de baixo nível, é porque o novo otimizador é extremamente rápido e a consulta é totalmente normalizada. Ou seja. Ele executa a esquerda e a direita em um único passe.

  7. Dependendo de seus SARGs e incompatibilidades do tipo de dados, etc. ainda pode ter que classificar, mas isso também é transmitido nos três níveis: subsistema de E/S de disco; (s) motor (s); e manipulador de rede. Se suas tabelas forem particionadas, também será paralelada nesse nível.

  8. Se o seu servidor não estiver configurado e Seu conjunto de resultados é muito grande, pode ser necessário aumentar proc cache size e number of sort buffers. Isso é tudo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top