Domanda

Sto cercando di creare un identificatore univoco per ogni riga di una vista.La vista che ho si unisce a molte tabelle e quindi la chiave primaria di nessuna tabella mi aiuterà a identificare la riga.

Facendo una ricerca su Google sembra che io possa essere in grado di raggiungere questo obiettivo utilizzando rowid?Ma non sono sicuro di come fare riferimento al rowid della vista.Di seguito è riportato un esempio di come immaginavo avrebbe funzionato rowid, ma ovviamente non riesce con un errore di "colonna ambigua" perché non sto specificando una tabella specifica per rowid.

Es:


    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

Sto provando a farlo in una query e non in una procedura memorizzata.Qualsiasi aiuto sarebbe apprezzato!

Grazie!

È stato utile?

Soluzione

A quanto mi risulta, un rowid si riferisce a una riga in una tabella fisica, piuttosto che a una riga in un set di risultati (che è effettivamente ciò che è una visualizzazione).

Per ottenere un identificatore univoco per ogni riga, devi combinare in qualche modo le chiavi primarie delle tabelle a cui stai unendo.

Altri suggerimenti

Se non disponi di chiavi primarie primarie su tutte le tue tabelle, puoi selezionare i rowid dalle singole tabelle e concatenarli:

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

Non utilizzare la pseudo colonna ROWID, dipende dall'archiviazione (e potrebbe cambiare quando viene utilizzato l'utile ENABLE ROW MOVEMENT).Non è inoltre possibile utilizzarlo per cercare record (uniti) nella vista in modo efficiente.

In questo caso è meglio usare i PK reali sui propri record (affinché le ricerche negli indici funzionino).E non mi unirei a loro, ma userei solo più colonne: solo in questo modo puoi riselezionarle (con supporto dell'indice).

Questa domanda è risolta per un po 'di tempo, ma fai attenzione quando concateni le chiavi primarie. Ad esempio, quando hai key1 = 23 and key2 = 45 e lo concateni a 2345 non è chiaro se le chiavi fossero 23 and 45 o se fossero 2 and 345 .

Utilizza un delimitatore (23,45 -> 23_45) che non può essere presente in nessuna delle chiavi (non tutte le chiavi sono numeriche).Oppure riempire le chiavi fino alla lunghezza massima possibile (23,45 -> 00230045 (for key1 and key2 NUMBER(4,0))) .

Tieni anche presente la funzione Oracles (non tutti i DB possono gestirla) per definire chiavi primarie ed esterne su più colonne che potrebbero essere più veloci ed estendere le tue possibilità di clean join senza dover dividere la tua chiave concatinata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top