es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo unir dos tablas en dos campos usando Exposed?

Tengo las siguientes tablas de base de datos:

// Tabla CurrenciesTable
object CurrenciesTable : Table("currencies") {
    val symbol = varchar("symbol", 48)
    val name = varchar("name", 48)
    override val primaryKey = PrimaryKey(symbol)
}


// Tabla OrdersTable
object OrdersTable : IntIdTable("orders") {
    val baseCurrency = varchar("base_currency", 48)
    val counterCurrency = varchar("counter_currency", 48)
    val price = decimal("price", DECIMAL_PRECISION, DECIMAL_SCALE)
    val createdAtEpochSecond = long("created_at_epoch_second")
}

En la tabla OrdersTable, tengo los siguientes campos que hacen referencia a la tabla CurrenciesTable:

baseCurrency
counterCurrency

Quiero seleccionar registros de la tabla OrdersTable y unirlos con la tabla CurrenciesTable en dos campos. Así obtengo el símbolo y el nombre para cada moneda.

Aquí está mi consulta DSL para hacer unir solo en el campo baseCurrency.

// DSL Expuesto
OrdersTable.join(CurrenciesTable, JoinType.INNER, OrdersTable.baseCurrency, CurrenciesTable.symbol)
            .selectAll()
            .forEach {
                // Obteniendo datos del registro de OrdersTable
                it[OrdersTable.id].value
                it[OrdersTable.price]
                it[OrdersTable.createdAtEpochSecond]

                // Obteniendo datos del registro de CurrenciesTable (solo para baseCurrency)
                it[CurrenciesTable.symbol]
                it[CurrenciesTable.name]
            }

Intenté hacer una segunda unión de la siguiente manera:

// DSL Expuesto
OrdersTable.join(CurrenciesTable, JoinType.INNER, OrdersTable.baseCurrency, CurrenciesTable.symbol)
           .join(CurrenciesTable, JoinType.INNER, OrdersTable.counterCurrency, CurrenciesTable.symbol)

Sin embargo, obtengo la siguiente excepción:

Caused by: java.sql.SQLSyntaxErrorException: Not unique table/alias: 'currencies'
Tags:  ,

Answer

  1. Avatar for davy.ai

    La excepción “No hay tabla/alias único: ‘currencies'” se lanza porque estamos intentando unir la misma tabla “CurrenciesTable” dos veces en la misma consulta sin utilizar alias diferentes para cada unión.

    Para solucionar esto, podemos crear alias para cada unión y usarlos para hacer referencia a las tablas respectivas en la consulta. Aquí tienes un ejemplo de cómo podemos modificar la consulta DSL para unir los campos baseCurrency y counterCurrency.

    // DSL Expuesta
    val base = CurrenciesTable.alias("base")
    val counter = CurrenciesTable.alias("counter")
    
    OrdersTable.join(base, JoinType.INNER, OrdersTable.baseCurrency, base[CurrenciesTable.symbol])
               .join(counter, JoinType.INNER, OrdersTable.counterCurrency, counter[CurrenciesTable.symbol])
               .selectAll()
               .forEach {
                   // Obteniendo los datos del registro de OrdersTable
                   it[OrdersTable.id].value
                   it[OrdersTable.price]
                   it[OrdersTable.createdAtEpochSecond]
    
                   // Obteniendo los datos del registro de CurrenciesTable tanto para baseCurrency como para counterCurrency
                   it[base[CurrenciesTable.symbol]]
                   it[base[CurrenciesTable.name]]
    
                   it[counter[CurrenciesTable.symbol]]
                   it[counter[CurrenciesTable.name]]
               }
    

    Aquí creamos los aliases “base” y “counter” para la tabla “CurrenciesTable” y los utilizamos para unir con la tabla “OrdersTable”. También utilizamos los aliases para hacer referencia a las respectivas tablas en la consulta y evitar la excepción.

Comments are closed.