Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Realizar Join entre n1 líneas de una tabla y n2 líneas de otra tabla (https://www.clubdelphi.com/foros/showthread.php?t=73346)

gluglu 15-04-2011 19:34:08

Realizar Join entre n1 líneas de una tabla y n2 líneas de otra tabla
 
El caso es que si tengo los registros de una tabla A con valores 1, 2, 3, 4, y una tabla B con valores A y B, quiero que un Select me devuelva un 'join' en el que los valores de la tabla A se unan con los valores de la tabla B en un número igual a la cantidad de registros que tenga la tabla B, y el resto sea null en el valor devuelto por tabla B.

Algo así como obtener

1 A
2 B
3 null
4 null

Si fueran por ejemplo 7 registros en tabla A (del 1 al 7) y 4 registros en tabla B (de A a D), tendría que obtener

1 A
2 B
3 C
4 D
5 null
6 null
7 null

Espero haberme explicado correctamente :p

Caro 15-04-2011 19:45:57

Hola gluglu, ¿se relacionan por algún campo tus dos tablas?.

Saluditos

gluglu 15-04-2011 19:59:11

Si ... claro .... se me olvidó ese detalle. Digamos que en el caso del ejemplo los registros de amabas tablas tuvieran una clave común CLAVE1.

Caro 15-04-2011 20:03:27

Cita:

Empezado por gluglu (Mensaje 397257)
Si ... claro .... se me olvidó ese detalle. Digamos que en el caso del ejemplo los registros de amabas tablas tuvieran una clave común CLAVE1.

Y yo resolviendo sin una clave en común :D, debes utilizar left join.

Código SQL [-]
Select a.campo, b.campo
From tablaA a left join tablaB b on (a.clave=b.clave)

Saluditos

gluglu 15-04-2011 20:05:43

Lo acabo de realizar con un Stored Procedure :

Código SQL [-]
CREATE OR ALTER PROCEDURE PRUEBA (
    in_Clave integer,
    in_count integer)
returns (
    out_B Char(1))
as
declare variable sel_B char(1);
declare variable aux_count integer;
begin
  AUX_COUNT = 1;
  OUT_B = null;
  For Select CAMPO_1
      from TABLA_B
      where CLAVE1 = :IN_CLAVE
      into SEL_B
  do begin
    if (:AUX_COUNT = :IN_COUNT) then begin
      OUT_B = :SEL_B;
      Suspend;
      Leave;
    end
    AUX_COUNT = AUX_COUNT + 1;
  end
end

Y la consulta sería algo como
Código SQL [-]
Select TA.CAMPO_1 TB.OUT_B
from TABLA_A TA
left join PRUEBA(TA.CLAVE1, CAMPO_1) TB
  on TA.CAMPO_1 = TA.CAMPO_1

Casimiro Notevi 15-04-2011 20:08:58

La solución de Caro parece más sencillita :D

gluglu 15-04-2011 20:17:43

Que barbaridad !!

Me acabo de dar cuenta de lo tonto que he sido al crear este hilo .... :(

Mil disculpas Caro ! Está claro que uno se complica la vida y después al ponerlo en un hilo y querer simplificar el hilo al máximo, no se dá uno cuenta de lo que escribe ....

A ver .... la cosa es más complicada que lo explicado, pero entonces ya volvemos a enreversar tanto la explicación que probablemente nadie me entienda :confused:

Hago un Select de una tabla con un montón de campos, con una group by de varios campos y una condición posterior en un having by.

Código SQL [-]
Select BO.BOOKINGNO, BO.CATEGORYNO, BO.SUBCATEGORYNO,
  C2.PAXNO, SP_AI.OUT_COUNTER
from BOOKINGS_OBJECTSTYPE BO
left join CATEGORIES C1
  on C1.CATEGORYNO     = BO.CATEGORYNO
  and C1.SUBCATEGORYNO = 0
left join CATEGORIES C2
  on C2.CATEGORYNO     = BO.CATEGORYNO
  and C2.SUBCATEGORYNO = BO.SUBCATEGORYNO
left join SP_PAXDETAIL_AUTOINC(BO.BOOKINGNO, BO.CATEGORYNO, BO.SUBCATEGORYNO) SP_AI
  on BO.BOOKINGNO      = BO.BOOKINGNO
  and BO.CATEGORYNO    = BO.CATEGORYNO
  and BO.SUBCATEGORYNO = BO.SUBCATEGORYNO
where C1.OBJECTRESERVATION = 0
group by BO.BOOKINGNO, BO.CATEGORYNO, BO.SUBCATEGORYNO, C2.PAXNO,
  SP_AI.OUT_COUNTER
having Sum(BO.QUANTITY) - (Select Count(BRL.CATEGORYNO) from BOOKINGS_ROOMINGLIST BRL
                           where BRL.CATEGORYNO  = BO.CATEGORYNO
                           and BRL.SUBCATEGORYNO = BO.SUBCATEGORYNO
                           and BRL.BOOKINGNO     = BO.BOOKINGNO) > 0

Este Select busca en BOOKINGS_OBJECTSTYPE todos los registros y los agrupa por BOOKINGNO, CATEGORYNO y SUBCATEGORYNO.

Cada uno de esos registros tiene una cantidad determinada (QUANTITY) que agrupo a su vez en Sum(QUANTITY), y además obtengo un número de registros en otra tabla adicional relacionada también.

Esta diferencia entre ambos valores, la aplico internamente en un SP denominado SP_PAXDETAIL_AUTOINC para que de cada BOOKINGNO, CATEGORYNO y SUBCATEGORYNO me devuelva N registros dependiendo de esa diferencia anterior.

Y a todo estos resultados, ahora me toca buscar en otra tabla diferente otros registros relacionados por otro campo, y si existen, los devuelvo con sus campos para los N primeros registros que obtuve en la consulta anterior.

Demasiado complicado para entenderlo rápidamente ... :o

Por eso intenté simplificar al máximo el hilo y no me dí cuenta de la trivialidad que estaba preguntado !!! :p

gluglu 15-04-2011 20:33:19

Trivial ... de todas maneras !!

La verdad es que a pesar de todo con un simple Left Join funciona, incluido todo el tocho de Select que he puesto antes :o

Gracias por haberme hecho darme cuenta de lo simple dentro de lo complicado !


La franja horaria es GMT +2. Ahora son las 07:17:34.

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