2008-10-02 14 views
6

Estoy usando la base de datos sybase para consultar el informe de transacciones diarias. Tuve subconsulta en mi script.¿Hay algo como SELECT LAST en la consulta SQL?

Aquí, como va:

SELECT orders.accountid ,items.x,etc 
(SELECT charges.mistotal FROM charges where items.id = charges.id) 
FROM items,orders 
WHERE date = '2008-10-02' 

Aquí estoy recibiendo el mensaje de error como:

subconsulta no puede devolver más de uno valora

Mis valores son 7,50 , 25.00

Quiero devolver el 25.00, pero cuando se utiliza

(SELECT TOP 1 charges.mistotal FROM charges where items.id = charges.id) 

Mi resultado es 7,50, pero quiero volver 25.00

¿Alguien tiene alguna idea mejor?

+0

¿Por qué no publica la consulta completa y explica cómo elegiría el "último" valor de charge.mistotal. Dependiendo del resto de la consulta y de lo que quiere decir "último", es posible que pueda reemplazar la subconsulta con otra combinación y una función agregada. ¡Necesitamos detalles! :) – Matt

Respuesta

2

¿Bajo qué criterio elige seleccionar 25.00 en lugar de 7.5?

Si está relacionado con el valor máximo, puede intentar usar la función MAX() en ese campo.

Si está relacionado con la última fila cronológicamente añadida, intente utilizar MAX() en el campo de fecha y hora, si tiene detalles sobre las horas y los minutos en que se agregó.

1

Usted podría intentar esto:

SELECT MAX(charges.mistotal) FROM charges WHERE items.id = charges.id 
9
SELECT TOP 1 * 
FROM dbo.YourTable 
ORDER BY Col DESC 

En su caso, supongo que sería

SELECT TOP 1 charges.mistotal 
FROM charges where items.id = charges.id 
ORDER BY charges.mistotal DESC 
+0

Creo que quiere la última orden ingresada, no la orden máxima ingresada ... – CodeRedick

0

SELECT TOP 1 charges.mistotal DE cargos en items.id = cargos. id ORDEN POR cargos.id DESC

La cláusula order by se asegurará de que vuelva en el orden de la ID, y el DESC significa descendente, por lo que primero le dará el valor más grande (más nuevo). TOP 1, por supuesto, se asegura de que usted obtenga ese.

0

Ordene su subconsulta. Si desea el "último" valor, necesita definir cómo determinar qué elemento es el último (recuerde, los conjuntos de resultados de SQL están desordenados de manera predeterminada).

Por ejemplo:

(SELECT TOP 1 charges.mistotal FROM charges where items.id = charges.id 
ORDER BY charges.mistotal DESC) 

Esto volvería 25.00 en lugar de 7,50 (a partir de los ejemplos de datos anteriores), pero estoy asumiendo que desea que este valor sea "último" porque es más grande. Puede haber algún otro campo que tenga más sentido para usted ordenar; quizás tenga una columna de marca de tiempo, por ejemplo, y podría ordenarla para obtener el valor más reciente en lugar del valor más grande. La clave es simplemente definir lo que quieres decir con "último".

+0

Cuando incluyo ORDER BY en mi subconsulta, me da error de sintaxis cerca de ORDER ... – jbcedge

+0

No uso Sybase (soy más de MS SQL Server), pero estoy bastante seguro de que esta es la sintaxis estándar que debe implementar cualquier rdbms. Todo lo que puedo decir es que revises tu sintaxis. – Matt

1

tanto, se puede utilizar el orden inverso:

(SELECT TOP 1 charges.mistotal 
    FROM charges 
    WHERE items.id = charges.id 
    ORDER BY charges.mistotal DESC 
) 

En realidad, ya que usted no dio una orden explícita, la secuencia de los resultados devueltos no está definido, y que son sólo suerte que le dio el respuesta que no quisiste; podría haberle dado la respuesta que deseaba, y entonces quizás no se haya dado cuenta de que no siempre fue correcta hasta que entró en producción.

O bien, se puede utilizar:

(SELECT MAX(charges.mistotal) 
    FROM charges 
    WHERE charges.id = items.id 
) 

O es que realmente quiere un SUM?

1

Para obtener el primero, utilice seleccionar top 1 | primero * de la tabla orden ascendente para obtener el último, simplemente invierta su orden.