[firebase-br] Cross Join

Sandro Souza escovadordebits em gmail.com
Ter Mar 2 15:33:03 -03 2010


Bom dia/tarde Rafael.

Grande Rafael, também fiquei intrigado com essa questão do CROSS JOIN.

Pelo que pude pesquisar, o CROSS JOIN produz um produto cartesiano entre 
as tabelas envolvidas, ou seja, para cada registro/linha da primeira 
tabela, todos os registros da segunda, que atendam as condições do 
WHERE, são repetidas, que é o tal produto cartesiano.

Vamos fazer o seguinte exemplo:

1 - Criando duas tabelas a serem "cruzadas".

CREATE TABLE TABELA_A (VALOR CHAR(1) NOT NULL, CONSTRAINT PK_TABELA_A 
PRIMARY KEY (VALOR));

e

CREATE TABLE TABELA_B (VALOR CHAR(1) NOT NULL, CONSTRAINT PK_TABELA_A 
PRIMARY KEY (VALOR));

2 - Preenchendo essas tabelas com alguns registros/linhas de exemplo.

INSERT INTO TABELA_A VALUES('A');
INSERT INTO TABELA_A VALUES('B');

INSERT INTO TABELA_B VALUES('C');
INSERT INTO TABELA_B VALUES('D');

COMMIT;

3 - Cruzando os registros e produzindo um produto cartesiano.

SELECT
  A.VALOR VALOR_A,
  B.VALOR VALOR_B
FROM
  TABELA_A A
    CROSS JOIN TABELA_B B;

Produz o seguinte resultado:

VALOR_A VALOR_B
------- -------
A       C
A       D
B       C
B       D

Ou seja, para cada registro da TABELA_A, todos os registros da TABELA_B 
foram repetidos, gerando assim o tal produto cartesiano.

Se é realmente isso mesmo, então não entendi porque foi criado o CROSS 
JOIN, já que conseguimos exatamente o mesmo resultado quando usamos um 
JOIN (INNER JOIN) sem interligar as tabelas, ou seja, o seguinte código 
produz exatamente o mesmo resultado do CROSS JOIN:

SELECT
  A.VALOR VALOR_A,
  B.VALOR VALOR_B
FROM
  TABELA_A A,
  TABELA_B B;

Ou seja, apenas fiz um JOIN entre as tabelas, mas não fiz qualquer 
ligação entre elas, fazendo com que seja retornado exatamente o mesmo 
resultado.

Acho muito bom quando sei que o Firebird dá suporte a mais recursos, mas 
nesse caso em particular, achei isso um tanto supérfulo.

De qualquer modo, dar suporte a isso significa que permite que 
aplicações que usem o CROSS JOIN funcionem com ele sem maiores 
alterações, o que é excelente.

Pessoal, os mais entendidos poderiam comentar esse ponto, por favor?

Existe realmente uma situação em que um JOIN sem ligação entre as 
tabelas não geraria o mesmo resultado de um CROSS JOIN?

Agradeço pela atenção. :D

rafael sacoman mussinato escreveu:
> *Exemplo:*
>
> *select* g.chave
>    *from* notas n
>    *join* clifor c *on* c.codigo = n.codcli
>    *cross join *dados_emitente d
>    *cross join *gera_chavenfe (c.cod_estado,  n.emissao, d.cnpj,
> n.serienf, n.nota_fiscal, n.codigo_numerico,55) g
>    *where* n.nota_fiscal = 1
>
> refere-se a este link: http://www.firebase.com.br/fb/artigo.php?id=2128
>
> qual a diferença do Cross Join ?
>
> e por que na 3° linha tem um join  ( sem inner, left, right)
>
> alguem pode me dizer, achei este sql no site do firebase....
>
> t+
>
>
> ----------------------------------------------------------
>
> Rafael ( Aux. Desenvolvimento)
>
> Defence Informatica Desenvolvimento de software
> Cianorte-Pr;
> www.defence.com.br
> " Tudo posso Naquele que me fortalece"
> ________________________________________
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>   




Mais detalhes sobre a lista de discussão lista