Pergunta

Estou tentando criar um identificador exclusivo para cada linha de uma visualização.A visão que eu tenho junta muitas tabelas e, portanto, nenhuma chave primária da tabela vai me ajudar a identificar a linha.

Fazendo uma pesquisa no Google, parece que posso conseguir isso usando o rowid?Mas não tenho certeza de como fazer referência ao rowid da visualização.Abaixo está um exemplo de como eu imaginei que o rowid funcionaria, mas obviamente falha com um erro de 'coluna ambígua' porque não estou especificando uma tabela específica para o rowid.

Ex:


    with v_someTable (select...),
      v_anotherTable as (select blah, id from v_someTable where...),
      v_yetAnotherTable as (select foo, id from v_someTable where...)
    select distinct rowid, rt.key, v1.blah, v2.foo
    from realTable rt 
      left join v_anotherTable v1 on v1.id=rt.id 
      left join v_yetAnotherTable v2 on v2.id=rt.id

Estou tentando fazer isso em uma consulta e não em um procedimento armazenado.Qualquer ajuda seria apreciada!

Obrigado!

Foi útil?

Solução

Meu entendimento é que um rowid se refere a uma linha em uma tabela física, em vez de uma linha em um conjunto de resultados (que é efetivamente o que uma visualização é).

Para obter um identificador exclusivo para cada linha, você precisa combinar as chaves primárias das tabelas às quais está unindo de alguma forma.

Outras dicas

Se você não tiver chaves primárias em todas as suas tabelas, poderá selecionar os rowids das tabelas individuais e concatená-los:

SELECT rt.rowid||v1.rowid||v2.rowid as uniqueid
FROM ......

Não use a pseudocoluna ROWID, ela depende do armazenamento (e pode mudar quando o útil ENABLE ROW MOVEMENT é usado).Você também não pode usá-lo para pesquisar registros (unidos) na exibição de maneira eficiente.

É melhor usar os PKs reais em seus registros neste caso (para que as pesquisas de índice funcionem).E eu não iria juntá-los, mas apenas usar várias colunas - só assim você pode selecioná-los novamente (com suporte de índice).

Esta pergunta foi respondida por um tempo, mas tenha cuidado ao concatinar as chaves primárias. Por exemplo, quando você tem key1 = 23 and key2 = 45 e concatina-o com 2345 , não fica claro se as chaves eram 23 and 45 ou se eram 2 and 345 .

Use um delimitador (23,45 -> 23_45) que não pode ocorrer em nenhuma das chaves (nem todas as chaves são numéricas).Ou preencha as chaves até o comprimento máximo possível (23,45 -> 00230045 (for key1 and key2 NUMBER(4,0))) .

Também esteja ciente do recurso Oracles (nem todos os bancos de dados podem lidar com isso) para definir chaves primárias e estrangeiras em várias colunas, o que pode ser mais rápido e estender suas possibilidades de junções limpas sem ter que dividir sua chave concatinada.

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