Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Ayuda con sentencia SQL (https://www.clubdelphi.com/foros/showthread.php?t=20834)

Sick boy 27-04-2005 10:33:49

Ayuda con sentencia SQL
 
Hola amigos.
Tengo dos tablas PARADOX y no consigo dar con la sentencia SQL adecuada para el resultado que necesito.

Una tabla (A), contiene los campos ID (string, unico) y Datos (blob). Tiene más campos, pero no son problematicos.
La otra tabla (B) contiene los campos ID (string, NO UNICO) y Comentario (string).

Este seria un ejemplo de la tabla A:
Código:

ID          Datos
 1          Hola Mundo
 2          clubdelphi
 3          Internet
 4          Email

Este seria un ejemplo de la tabla B:
Código:

ID          Comentario
 3          Internet es el futuro!!!
 2          Buena Pagina
 3          Hay que actualizar a la version 2.0
 1          Tipico mensaje
 4          No more SPAM !!!

El listado que busco seria:
Todos los campos de la tabla A + el campo COMENTARIO de la tabla B, pero si en la tabla B hay más de un comentario sobre el mismo ID (como pasa con 3 -Internet) solo quiero ver el primero.

Esto es lo que busco:
Código:

ID          Datos              Comentario
 1          Hola Mundo      Tipico mensaje
 2          clubdelphi        Buena Pagina
 3          Internet            Internet es el futuro!!!
 4          Email                No more SPAM !!!

La sentencia que utilizo es:
Código:

SELECT * FROM A INNER JOIN B
  ON (A.id = B.id)
  ORDER BY A.id

Pero esta sentencia me devuelve una fila más de las que necesito:
Código:

ID          Datos              Comentario
 1          Hola Mundo      Tipico mensaje
 2          clubdelphi        Buena Pagina
 3          Internet            Internet es el futuro!!!
 3          Internet            Hay que actualizar a la version 2.0  <<-- Esto NO
 4          Email                No more SPAM !!!

¿Pueden ayudarme ??
Gracias
PD: Editado para ver mejor los ejemplos

Investment 27-04-2005 12:07:44

Esta sentencia te devolvería lo que quieres, pero...

Código:

SELECT DISTINCT a.id, a.datos, MIN(comentario) as comentario
FROM a , b
where a.id=b.id
group by a.id,a.dato

Código:

ID          Datos            Comentario
 1          Hola Mundo      Tipico mensaje
 2          clubdelphi      Buena Pagina
 3          Internet        Internet es el futuro!!!
 4          Email            No more SPAM !!!

...pero si tuvieses en la tabla b:
Código:

3          Internet es el futuro!!!
3          Atencion, Hay que actualizar a la version 2.0

te devolveria :

Código:

ID          Datos            Comentario
 1          Hola Mundo      Tipico mensaje
 2          clubdelphi      Buena Pagina
 3          Internet        Atencion, Hay que actualizar a la version 2.0
 4          Email            No more SPAM !!!


Sick boy 27-04-2005 12:27:13

Gracias, pero el campo DATOS es BLOB, y no lo puedo cambiar !!!!

Cita:

Esta sentencia te devolvería lo que quieres, pero...
SELECT DISTINCT a.id, a.datos, MIN(comentario) as comentario
FROM a , b
where a.id=b.id
group by a.id,a.dato
Ya habia intentado esta sentencia, deberia haber posteado que no funciona, lo siento.
El BDE no me permite GRUOP BY en los campos BLOB.
Tampoco me permite un CAST(datos as VARCHAR(200)) con el que podría intentar tratar el campo BLOB como alfanumerico :(

Evidentemente, lo puedo hacer con 2 querys, pero ese no es el objetivo, ya que necesito 1 solo dataset.

Gracias por su ayuda

hermes_32 27-04-2005 13:06:51

Ya que no se puede agrupar por campos Blob, mi recomendación es que uses una tabla auxiliar donde almacenar los campos de la tabla B que te interesen y a partir de esa tabla "filtrada" ya puedes resolver facilmente el caso.

Un saludo.

Sick boy 27-04-2005 13:58:20

Gracias Hermes_32
Cita:

Ya que no se puede agrupar por campos Blob, mi recomendación es que uses una tabla auxiliar donde almacenar los campos de la tabla B que te interesen y a partir de esa tabla "filtrada" ya puedes resolver facilmente el caso.
Pero como digo en el post anterior, 2 tablas o 2 consultas no es una solución, el resultado debe estar en un solo dataset.

Las tablas tienen más campos que los comentados, pero ninguno crea problemas, solo el tipo BLOB.
Si quito el campo BLOB del query todo funciona, pero el caso es que ese campo es importantisimo.

PD: De la tabla B, solo quiero 1 resultado, no me importa despreciar los demas, y no me importa si el COMENTARIO es el primero, el ultimo o el 26º

Gracias

hermes_32 27-04-2005 17:15:18

Buenas de nuevo Sick. He resuelto el problema con un campo calculado. Puedo enviarte el programilla por mail si quieres ya que por aqui darte la solucion es poco estético.

un saludo.

Sick boy 28-04-2005 12:02:44

Gracias Hermes.

Si quieres enviarlo, mi correo es txuko.arroba.retemail.es (sustituir .arroba. por @)

De todas formas, creo que se pueden postear ficheros de texto, y puesto que parece que nadie sabe como resolver esto, seria muy interesante hacerlo publico (si tu quieres, claro).

Gracias de nuevo, y por el momento, la pregunta sigue en el aire......

Saludos

jachguate 28-04-2005 17:17:40

En una sola consulta podria ser:

Código SQL [-]
Select *
  from a
      inner join b on a.ID = b.ID
 where b.comentario = (
      Select min(comentario)
        from b b2
       where b2.ID = a.ID
        )

Claro, b.comentario no puede ser blob.

Hasta luego.

;)

Sick boy 29-04-2005 18:02:04

Gracias jachguate, pero no funcionó.

En Interbase / Firebird se que se pueden hacer subconsultas, pero lo he probado en Paradox y me dice "Capability not supported" :(

De momento, he puesto un segundo query en el evento OnGetValue del componente al cual tengo que asignar el dataset. Asi consigo rellenar manualmente ese campo. Un poco chapuza, pero de momento funciona !!!

Tengo que dejar PARADOX, no es la primera vez que no consigo que sentencias SQL "normalitas" funcionen.....

Gracias a todos, aun no he perdido la esperanza de encontrar una solución más limpia y/o eficiente.


La franja horaria es GMT +2. Ahora son las 06:03:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi