Question

J'essaie de créer un identifiant unique pour chaque ligne d'une vue. La vue que j'ai rejoint beaucoup de tables et donc la clé principale de la table ne m'aidera à identifier la ligne.

Faire une recherche Google, il semble que je puisse y parvenir en utilisant Rowid? Mais je ne sais pas comment référencer le Rowid de la vue. Vous trouverez ci-dessous un exemple de la façon dont j'imaginais que Rowid fonctionnerait, mais il échoue évidemment avec une erreur de «colonne ambiguë» car je ne spécifie pas un tableau spécifique pour 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

J'essaie de le faire dans une requête et non dans une procédure stockée. Toute aide serait appréciée!

Merci!

Était-ce utile?

La solution

Ma compréhension est qu'un rowid fait référence à une ligne dans un tableau physique, plutôt qu'à une ligne dans un ensemble de résultats (ce qui est effectivement ce qu'est une vue).

Pour obtenir un identifiant unique pour chaque ligne, vous devez combiner les clés principales des tables que vous rejoignez d'une manière ou d'une autre.

Autres conseils

Si vous n'avez pas de clés primaires principales sur toutes vos tables, vous pouvez sélectionner les rowids dans les tables individuelles et les concaténer:

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

N'utilisez pas la colonne Rowid Pseudo, c'est le stockage de stockage (et peut changer lorsque l'utile ENABLE ROW MOVEMENT est utilisé). Vous ne pouvez pas non plus l'utiliser pour rechercher des enregistrements (joints) sur la vue de manière efficace.

Il est préférable d'utiliser le vrai PKS sur vos enregistrements dans ce cas (pour que les recherches d'index fonctionnent). Et je ne les rejoindrais pas, mais j'utilise simplement plusieurs colonnes - seulement de cette façon, vous pouvez les resélectionner (avec le support d'index).

Cette question est répondue depuis un certain temps, mais soyez prudent lorsque vous concatinez les clés primaires. Par exemple lorsque vous avez key1 = 23 and key2 = 45 et le concatiiner à 2345 Il n'est pas clair si les clés étaient 23 and 45 ou s'ils étaient 2 and 345.

Utiliser un délimiteur (23,45 -> 23_45) Cela ne peut se produire dans aucune des clés (toutes les clés ne sont pas numériques). Ou remplissez les clés de la longueur possible maximale (23,45 -> 00230045 (for key1 and key2 NUMBER(4,0))).

Soyez également conscient de la fonction Oracles (tous les DB ne peuvent pas gérer cela) pour définir les clés primaires et étrangères sur plusieurs colonnes qui pourraient être plus rapides et étendre vos possibilités de jointures propres sans avoir à diviser votre clé concatinée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top