使用rawQuery的sql查询存在问题



我的问题是,我在PC上的DbBrowser for Sqlite中使用的下面的查询正确返回了数据。但是,一旦在应用程序中执行,它并没有向我显示我缺少的所有数据UNION SELECT的结果,就好像我只解决了UNION 之前的第一部分

val parametro_lista_seleccionada: Array<String> =
arrayOf(lista_seleccionada.toString()) //Creamos un array con el id de la lista seleccionada para pasarla como parametro al SELECT
val cursor_consulta_sql: Cursor = bd_conexion.rawQuery("SELECT * FROM contenido_lista AS cl, productos AS p WHERE cl.id_lista = ? AND cl.id_producto = p.id_producto UNION SELECT * FROM contenido_lista AS cl, productos_manuales AS pm WHERE cl.id_lista = ? AND cl.id_producto = pm.id_producto ORDER BY p.id_seccion,pm.id_seccion" ,parametro_lista_seleccionada)

我假设两个统一查询返回的列数相同,因为您不会得到任何错误

您应该将正确的JOIN语法与ON子句结合使用,而不是将这种过时的语法与逗号结合使用

此外,当在UNION末尾使用ORDER BY子句时,它将应用于UNION的结果,而不应用于任何参与查询
因此,不能将先前设置的表的别名用于ORDER BY之后的列

最后,在您的查询中有2个?占位符,因此您必须传递一个由2个字符串组成的数组作为rawQuery()的第二个参数。我想这是同一个字符串,但必须在数组中使用两次

因此更改为:

val parametro_lista_seleccionada = arrayOf(lista_seleccionada.toString(), lista_seleccionada.toString())
val cursor_consulta_sql: Cursor = bd_conexion.rawQuery(
"SELECT * " +
"FROM contenido_lista AS cl INNER JOIN productos AS p " + 
"ON cl.id_producto = p.id_producto " + 
"WHERE cl.id_lista = ? " + 
"UNION " + 
"SELECT * " + 
"FROM contenido_lista AS cl INNER JOIN productos_manuales AS pm " + 
"ON cl.id_producto = pm.id_producto " + 
"WHERE cl.id_lista = ? " + 
"ORDER BY id_seccion" ,
parametro_lista_seleccionada
)

仅凭lista_seleccionada的名字,我就猜一猜,也许它不是一个字符串。这是一份清单吗
如果是,则lista_seleccionada.toString()将不会返回2个字符串,而是返回1个字符串,该字符串是以逗号分隔的字符串列表
因此更改为:

val parametro_lista_seleccionada = arrayOf(lista_seleccionada[0], lista_seleccionada[1])

或者如果列表中的项目是数字:

val parametro_lista_seleccionada = arrayOf(
lista_seleccionada[0].toString(), 
lista_seleccionada[1]
)

最新更新