Pregunta

Estoy intentando crear un identificador único para cada fila de una vista.La vista que tengo une muchas tablas y, por lo tanto, la clave principal de ninguna tabla me ayudará a identificar la fila.

Al hacer una búsqueda en Google, parece que puedo lograr esto usando Rowid.Pero no estoy seguro de cómo hacer referencia al ID de fila de la vista.A continuación se muestra un ejemplo de cómo imaginé que funcionaría Rowid, pero obviamente falla con un error de "columna ambigua" porque no estoy especificando una tabla específica para 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

Estoy intentando hacer esto en una consulta y no en un procedimiento almacenado.¡Cualquier ayuda sería apreciada!

¡Gracias!

¿Fue útil?

Solución

Mi entendimiento es que un rowid se refiere a una fila en una tabla física, en lugar de a una fila en un conjunto de resultados (que es efectivamente lo que es una vista).

Para obtener un identificador único para cada fila, necesitarás combinar las claves principales de las tablas que estás uniendo de alguna manera.

Otros consejos

Si no tiene claves primarias primarias en todas sus tablas, puede seleccionar las filas de las tablas individuales y concatenarlas:

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

No use la pseudocolumna ROWID, depende del almacenamiento (y puede cambiar cuando se usa el útil código ENABLE ROW MOVEMENT).Tampoco puede usarlo para buscar registros (unidos) en la vista de una manera eficiente.

En este caso, es mejor usar los PK reales en sus registros (para que funcionen las búsquedas de índices).Y no me uniría a ellos, solo usaría varias columnas, solo de esta manera puede volver a seleccionarlas (con soporte de índice).

Esta pregunta está respondida por un tiempo, pero tenga cuidado al concatinar las claves primarias. Por ejemplo, cuando tiene key1 = 23 and key2 = 45 y lo concatena a 2345 , no está claro si las claves eran 23 and 45 o si eran 2 and 345 .

Utilice un delimitador (23,45 -> 23_45) que no pueda aparecer en ninguna de las claves (no todas las claves son numéricas).O complete las claves hasta la longitud máxima posible (23,45 -> 00230045 (for key1 and key2 NUMBER(4,0))) .

También tenga en cuenta la función Oracles (no todas las bases de datos pueden manejar esto) para definir claves primarias y externas en múltiples columnas, lo que podría ser más rápido y ampliar sus posibilidades de uniones limpias sin tener que dividir su clave concatinada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top