Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Join que me devuelva un Registro adicional (https://www.clubdelphi.com/foros/showthread.php?t=76090)

gluglu 07-10-2011 21:23:42

Join que me devuelva un Registro adicional
 
Hola !

Tengo una consulta compleja que entre otros, hace un Left Join con una tabla determinada, de tal manera de que si existen registros en esa tabla con la clave indicada, me devuelve X registros dependiendo de los registros que cumplan la condición de la clave.

Lo que quiero conseguir es que si el Join devuelve algún registro, además me añada un registro con la Clave = 0.

No sé si me he explicado correctamente.

Código SQL [-]
Select T1.CLAVE, T2.SUBCLAVE
from TABLA1 T1
left join TABLA2 T2
  on T2.CLAVE = T1.CLAVE

Si TABLA2 contiene registros con CLAVE, entonces que me devuelva además un registro adicional con CLAVE = 0

Ejemplo :
TABLA1
CLAVE
A
B
C

TABLA2
CLAVE, SUBCLAVE
B 1
B 2
B 3

La consulta me devería devolver :
CLAVE, SUBCLAVE
A
B 0
B 1
B 2
B 3
C

Necesito que este valor me lo devuelva el concreto el 'Join' ya que hay otros múltiples Join's que se generan antes, y no lo puedo hacer con subconsultas.

Gracias por vuestra ayuda.

gluglu 07-10-2011 22:07:36

No sé si será eficiente o no .... pero esto parece que funciona :

Código SQL [-]
Select T1.CLAVE, T2.SUBCLAVE
from TABLA1 T1
left join (Select CLAVE, SUBCLAVE
           from TABLA2
             union
           Select CLAVE, 0 as SUBCLAVE
           from (Select CLAVE,
                 from TABLA2
                 group by CLAVE)) T2
on T1.CLAVE = T2.CLAVE

:o :o

egostar 07-10-2011 22:49:04

Cita:

Empezado por gluglu (Mensaje 414918)
No sé si será eficiente o no .... pero esto parece que funciona :

Código SQL [-]
Select T1.CLAVE, T2.SUBCLAVE
from TABLA1 T1
left join (Select CLAVE, SUBCLAVE
           from TABLA2
             union
           Select CLAVE, 0 as SUBCLAVE
           from (Select CLAVE,
                 from TABLA2
                 group by CLAVE)) T2
on T1.CLAVE = T2.CLAVE

:o :o

A menos que tengas más datos en las tablas el resultado es el que esperas.

saludos

gluglu 08-10-2011 09:15:56

Hola Egostar !

La imagen que adjuntas se refiere al resultado de un Join normal, y queda claro cual es el resultado.

Lo que necesito, es que en los registros con la clave B, me añada un registro B con una clave 0, que en tu ejemplo no se muestra.

La consulta y las tablas que he puesto aquí son muy simplificadas, a modo de ejemplo. Pero lo que trataba de explicar era que si existen registros en la Tabla2 con la Clave correspondiente, la consulta me devuelva en cada caso que exista esa clave en Tabla2, un registro adicional con SUBCLAVE = 0

Cita:

La consulta me devería devolver :
CLAVE, SUBCLAVE
A
B 0
B 1
B 2
B 3
C
Gracias por tus comentarios.

Casimiro Notevi 08-10-2011 09:24:11

¿Y esos números 'subclave' qué valores pueden tener?, lo digo porque si son valores fijos entonces puedes hacerlo con un store procedure y un bucle desde 0 hasta N-1 recorriendo la tabla 2.

gluglu 08-10-2011 09:45:16

Hola Casimiro !

Los valores son valores que están en la Tabla2, según los haya creado el usuario, por lo tanto no son 'fijos'.

Sé que todo lo que pretendo lo puedo meter en un Stored Procedure (por cierto, no lo dije, utilizo Firebird 2.1), y ahí en el SP hago lo que quiero. Lo que pasa es que el asunto viene por otro lado ...

Tenía una consulta hecha en la cual posteriormente, recorriendo dicha consulta, tenía que buscar un valor nuevo dependiendo de los valores de la consulta inicial. He tenido que realizar algunos cambios en algunas tablas, añadiendo algunos campos más, y ahora se me plantea optimizar esa consulta, si fuera posible. Y quiero controlar si el tiempo es más eficiente teniendo una consulta inicial de aprox. 40 registros, y recorrer esa consulta de 40 registros para después realizar unas 180 consultas adicionales en un bucle, dependiendo del valor de esos 40 registros iniciales, o si es mejor en cuestiones de tiempo obtener inicialmente una consulta de unos 1200 registros, tratar esos 1200 registros y no tener que realizar consultas adicionales en un bucle de programa.

Es por ello que intentaba optimizar la consulta en sí misma, sin la necesidad de tener que crear un SP.

Casimiro Notevi 08-10-2011 10:15:18

Entonces según entiendo lo que quieres es que se añada, se cree, un registro en el resultado de la consulta, pero un registro que no existe.
Si lo he entendido bien, y puedo estar equivocado, por supuesto, pero dudo mucho que puedas hacer eso con un select. Vas a tener que hacer un SP.

gluglu 08-10-2011 10:34:50

Exactamente es eso, lo que dices, que se 'añada' un nuevo registro en el propio Select. ... me has pillado la idea : Añadir un registro que no existe.

Precisamente eso es lo que conseguí con el Select que indiqué en el 2º Post de este hilo.

Casimiro Notevi 08-10-2011 10:47:47

Creo que voy a tomarme el café porque no lo he entendido:
Si hago esto:

Código SQL [-]
Select t1.CLAVE, 0 as subclave
from TABLA1 t1
union 
select t2.clave, t2.subclave
from tabla2 t2

¿No es lo que buscas?

Es que el ejemplo que has puesto lo que hace es 'añadir' un B0, ¿pero es eso lo que quieres, el cero?
Si tengo, por ejemplo:

tabla1
A
B
C

tabla 2
B 1
B 2
B 3
B 5

El resultado sería:
A 0
B 0
B 1
B 2
B 3
B 5
C 0

¿Qué quiéres conseguir?, que además venga el B 4 ?

gluglu 08-10-2011 12:20:52

Es correcto lo que indicas Casimiro.

El resultado que deseo obtener es exactamente el que indicas, PERO lo necesito obtener en un Join, porque como indiqué, la consulta es muchísimo más compleja, y ese resultado que necesito obtener, viene dado por un Join ...

Por eso no puedo hacer una unión de dos Select principales, ya que me cambiaría toda la estructura de la consulta, no siendo eficiente ni controlable.

El mismo resultado que tu estás indicando, es el que obtengo haciendo la unión de dos select dentro del propio Join, con la 'subconsulta' dentro del Join que indiqué.

Código SQL [-]
Select T1.CLAVE, T2.SUBCLAVE
from TABLA1 T1
left join (Select CLAVE, SUBCLAVE
           from TABLA2
             union
           Select CLAVE, 0 as SUBCLAVE
           from (Select CLAVE,
                 from TABLA2
                 group by CLAVE)) T2
on T1.CLAVE = T2.CLAVE

Es obtener el mismo resultado que indicas, con una unión, pero dentro del 'Join', que era mi pretensión inicial.

Si pusiera la consulta completa que tengo, sería absurdo ... porque casi no la domino ni yo ! :p

gluglu 08-10-2011 12:28:41

Añado algunos datos más ... para complicarlo aún mas ...

La consulta inicial es la unión de tres Select individuales. Por ello no puedo meter una unión más como principal para obtener el resultado que deseo, tal y como comentamos anteriormente.

Además, finalmente no puedo hacer lo que pretendo en un Stored Procedure porque además tengo que comprobar unos datos que tengo en memoria, en concreto, en unas 5000 celdas de un StringGrid (65 columnas x 80 filas).

Pasar todo ese cálculo a un SP, con consultas SQL adicionales sobre tablas temporales, sin duda alguna aumentaría el tiempo de proceso frente a hacer las oportunas comprobaciones sobre el StringGrid que tengo en memoria.

Vamos ... un buen lío !! :rolleyes:

Casimiro Notevi 08-10-2011 13:40:39

Cita:

Empezado por gluglu (Mensaje 414963)
Vamos ... un buen lío !! :rolleyes:

Es que te gusta complicarte :p

Aunque yo estoy ahora en un embrollo que no tengo ni idea de cómo solucionarlo, a ver si lo consigo solucionar este fin de semana, si no tendré que poner una pregunta en clubdelphi, a ver si alguien contesta :)

abelg 12-10-2011 16:42:02

Hola espero te sirva.

Código SQL [-]
Create table #tabla1 (clave varchar(2))
Create table #tabla2 (clave varchar(2), subclave int)

insert into #tabla1 values ('A')
insert into #tabla1 values ('B')
insert into #tabla1 values ('C')


insert into #tabla2 values ('B', 1)
insert into #tabla2 values ('B', 2)
insert into #tabla2 values ('B', 3)
insert into #tabla2 values ('B', 5)


Select 
   t1.clave,
   subclave = case when t2.clave is null 
      then 
         0 
      else 
        t2.subclave
      end
from #tabla1 t1
left join #tabla2 t2 on t1.clave = t2.clave

drop table #tabla1
drop table #tabla2

salu2


La franja horaria es GMT +2. Ahora son las 19:04:12.

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