Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Tablas foráneas referenciadas mas de una vez?
#1

Hola.
Resulta que tengo una tabla "recipientes" con una lista de recipientes y en esta existen dos campos que apuntan a la tabla "unidades".
El caso es que al crear una vista salta un error de ambigüedad ya que le aparece mas de una vez el campo "unidades.name"

¿Como se puede sortear este inconveniente?

LEFT JOIN unidades ON recipientes.wtuom=unidades.idx
LEFT JOIN unidades ON recipientes.tuom=unidades.idx

SQL
  1. CREATE TABLE "unidades" (
  2.     "idx"    INTEGER,
  3.     "name"    TEXT NOT NULL UNIQUE,
  4.     "symbol"    TEXT,
  5.     "type"    INTEGER,
  6.     "basic"    TEXT,
  7.     "other"    TEXT,
  8.     FOREIGN KEY("type") REFERENCES "magnitudes"("idx"),
  9.     PRIMARY KEY("idx" AUTOINCREMENT)
  10. )
  11.  
  12. CREATE TABLE "recipientes" (
  13.     "idx"    INTEGER,
  14.     "tag"    TEXT NOT NULL UNIQUE,
  15.     "wt"    REAL,
  16.     "wtuom"    INTEGER,
  17.     "temp"    REAL,
  18.     "tuom"    INTEGER
  19.     FOREIGN KEY("wtuom") REFERENCES "unidades"("idx"),
  20.     FOREIGN KEY("tuom") REFERENCES "unidades"("idx"),
  21.     PRIMARY KEY("idx" AUTOINCREMENT)
  22. )
  23.  
  24. CREATE VIEW "view_recipientes" AS SELECT
  25.     recipientes.idx AS idx,
  26.     recipientes.tag AS tag,
  27.     recipientes.wt AS wt,
  28.     recipientes.wtuom AS wtuom,
  29.     recipientes.temp AS temp,
  30.     recipientes.tuom AS tuom,
  31.     FROM recipientes
  32. LEFT JOIN unidades ON recipientes.wtuom=unidades.idx
  33. LEFT JOIN unidades ON recipientes.tuom=unidades.idx
  34. ORDER BY recipientes.idx,recipientes.tag ASC


Nota: este es un ejemplo resumido pero en el caso real tengo 15 campos apuntando a la tabla unidades.

1 Saludo.
    ¡Gracias!
#2

Solo viendo eso creo que el diseño está equivocado. Deberías hacer una sola referencia a recipientes y una nueva tabla tipo de recipiente o algo así, con las entradas tuom, wtuom o las que necesites.
No sé si me explico.

Saludos

No podemos regresar
[-] Los siguientes 1 usuarios dice gracias a Shordi por este post:
  • tincho
    ¡Gracias!
#3

(15-08-2022, 20:43)Shordi escribió:  Solo viendo eso creo que el diseño está equivocado. Deberías hacer una sola referencia a recipientes y una nueva tabla tipo de recipiente o algo así, con las entradas tuom, wtuom o las que necesites.
No sé si me explico.

No, la tabla recipientes tiene dos campos referenciados la unidad_temperatura y unidad_peso pero ambas unidades están listadas en la tabla unidades
Pero ya lo he solucionado, pongo la solucion.

SQL
  1. CREATE TABLE "unidades" (
  2.     "idx"    INTEGER,
  3.     "name"    TEXT NOT NULL UNIQUE,
  4.     "symbol"    TEXT,
  5.     "type"    INTEGER,
  6.     "basic"    TEXT,
  7.     "other"    TEXT,
  8.     FOREIGN KEY("type") REFERENCES "magnitudes"("idx"),
  9.     PRIMARY KEY("idx" AUTOINCREMENT)
  10. )
  11.  
  12. CREATE TABLE "recipientes" (
  13.     "idx"    INTEGER,
  14.     "tag"    TEXT NOT NULL UNIQUE,
  15.     "wt"    REAL,
  16.     "wtuom"    INTEGER,
  17.     "temp"    REAL,
  18.     "tuom"    INTEGER
  19.     FOREIGN KEY("wtuom") REFERENCES "unidades"("idx"),
  20.     FOREIGN KEY("tuom") REFERENCES "unidades"("idx"),
  21.     PRIMARY KEY("idx" AUTOINCREMENT)
  22. )
  23.  
  24. CREATE VIEW "view_recipientes" AS SELECT
  25.     recipientes.idx AS idx,
  26.     recipientes.tag AS tag,
  27.     recipientes.wt AS wt,
  28.     u1.name AS wtuom,
  29.     recipientes.temp AS temp,
  30.     u2.name AS tuom,
  31.     FROM recipientes
  32. LEFT JOIN unidades u1 ON recipientes.wtuom=u1.idx
  33. LEFT JOIN unidades u2 ON recipientes.tuom=u2.idx
  34. ORDER BY recipientes.idx,recipientes.tag ASC



Nota: el ejemplo que puse al principio esta mal hecho. Al tratar de simplificar la cosa la pifie. Creo que esto ultimo que pongo esta bien.
La solución pasa por declarar un alias cuando la tabla es referenciada mas de una vez, en este caso u1 y u2

1 Saludo.
    ¡Gracias!
#4

Solo por si a alguien interesa ver como quedo finalmente el asunto adjunto las vistas reales que genera automáticamente el programa.
Vista que no funciona
SQL
  1. CREATE VIEW "view_equipments" AS SELECT
  2.     equipments.idx AS idx,
  3.     equipments.tag AS tag,
  4.     equipments.DESC AS DESC,
  5.     eqmcls.name AS TYPE,
  6.     pids.name AS pid,
  7.     documents.name AS mr,
  8.     equipments.flowr AS flowr,
  9.     engunits.name AS fwuom,
  10.     equipments.press AS press,
  11.     engunits.name AS psuom,
  12.     equipments.phead AS phead,
  13.     engunits.name AS phuom,
  14.     equipments.dpres AS dpres,
  15.     engunits.name AS dpuom,
  16.     equipments.dtemp AS dtemp,
  17.     equipments.dtuom AS dtuom,
  18.     drivers.name AS driver,
  19.     equipments.dvrpw AS dvrpw,
  20.     engunits.name AS pwuom,
  21.     equipments.wtdry AS wtdry,
  22.     equipments.wtwet AS wtwet,
  23.     equipments.wtuom AS wtuom,
  24.     equipments.xsize AS xsize,
  25.     equipments.ysize AS ysize,
  26.     equipments.zsize AS zsize,
  27.     equipments.szuom AS szuom,
  28.     equipments.remark AS remark
  29.     FROM equipments
  30. LEFT JOIN eqmcls ON equipments.TYPE=eqmcls.idx
  31. LEFT JOIN pids ON equipments.pid=pids.idx
  32. LEFT JOIN documents ON equipments.mr=documents.idx
  33. LEFT JOIN engunits ON equipments.fwuom=engunits.idx
  34. LEFT JOIN engunits ON equipments.psuom=engunits.idx
  35. LEFT JOIN engunits ON equipments.phuom=engunits.idx
  36. LEFT JOIN engunits ON equipments.dpuom=engunits.idx
  37. LEFT JOIN drivers ON equipments.driver=drivers.idx
  38. LEFT JOIN engunits ON equipments.pwuom=engunits.idx
  39. ORDER BY equipments.idx,equipments.tag ASC



Vista que si funciona
SQL
  1. CREATE VIEW IF NOT EXISTS "view_equipments" AS SELECT
  2.     equipments.idx AS idx,
  3.     equipments.tag AS tag,
  4.     equipments.DESC AS DESC,
  5.     eqmcls.name AS TYPE,
  6.     pids.name AS pid,
  7.     documents.name AS mr,
  8.     equipments.flowr AS flowr,
  9.     A01.name AS fwuom,
  10.     equipments.press AS press,
  11.     A02.name AS psuom,
  12.     equipments.phead AS phead,
  13.     A03.name AS phuom,
  14.     equipments.dpres AS dpres,
  15.     A04.name AS dpuom,
  16.     equipments.dtemp AS dtemp,
  17.     equipments.dtuom AS dtuom,
  18.     drivers.name AS driver,
  19.     equipments.dvrpw AS dvrpw,
  20.     A05.name AS pwuom,
  21.     equipments.wtdry AS wtdry,
  22.     equipments.wtwet AS wtwet,
  23.     equipments.wtuom AS wtuom,
  24.     equipments.xsize AS xsize,
  25.     equipments.ysize AS ysize,
  26.     equipments.zsize AS zsize,
  27.     equipments.szuom AS szuom,
  28.     equipments.remark AS remark
  29.     FROM equipments
  30. LEFT JOIN eqmcls ON equipments.TYPE=eqmcls.idx
  31. LEFT JOIN pids ON equipments.pid=pids.idx
  32. LEFT JOIN documents ON equipments.mr=documents.idx
  33. LEFT JOIN engunits A01 ON equipments.fwuom=A01.idx
  34. LEFT JOIN engunits A02 ON equipments.psuom=A02.idx
  35. LEFT JOIN engunits A03 ON equipments.phuom=A03.idx
  36. LEFT JOIN engunits A04 ON equipments.dpuom=A04.idx
  37. LEFT JOIN drivers ON equipments.driver=drivers.idx
  38. LEFT JOIN engunits A05 ON equipments.pwuom=A05.idx
  39. ORDER BY equipments.idx,equipments.tag ASC 



1 Saludo.
[-] Los siguientes 1 usuarios dice gracias a tincho por este post:
  • Shordi
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)