Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-11-2021
Avatar de MAXIUM
MAXIUM MAXIUM is offline
Miembro
 
Registrado: may 2005
Posts: 1.488
Poder: 20
MAXIUM Va camino a la fama
Insertar datos de un tabla en otra

Hola a todos,

Tengo una consulta SQL que no se como completar y no sé cual sea la mejor opción por lo que recurro a vuestra sapiencia.

Tengo la TABLA_A y en esta se van almacenando los siguientes datos.

TABLA_A

Código:
| ID | NOMBRE |TIPO|ESTADO|
|----|--------|----|------|
|  1 |CABINA1 |  A |ACTIVO|
|  2 |CABINA1 |  B |ACTIVO|
|  3 |CABINA1 |  B | LISTO|
|  4 |CABINA1 |  A |  OK  |
|  5 |CABINA2 |  A | LISTO|
|  6 |CABINA2 |  B |ACTIVO|
|  7 |CABINA2 |  A |  OK  |
|  8 |CABINA2 |  B | LISTO|
No importa el orden de almacenamiento de los datos, solo quiero obtener el ULTIMO estado de cada cabina, por lo que uso la siguiente consulta SQL

Código SQL [-]
SELECT * FROM TABLA_A
WHERE ID IN (SELECT MAX(ID) FROM TABLA_A GROUP BY NOMBRE, TIPO);

Y obtengo
Código:
| ID | NOMBRE |TIPO|ESTADO|
|----|--------|----|------|
|  3 |CABINA1 |  B | LISTO|
|  4 |CABINA1 |  A |  OK  |
|  7 |CABINA2 |  A |  OK  |
|  8 |CABINA2 |  B | LISTO|
Lo que quiero es insertar todo en una segunda tabla, pero del siguiente modo
TABLA_B

Código:
| ID |NOMBRE  |TIPO|ESTADO|TIPO|ESTADO|
|----|--------|----|------|----|------|
|  1 |CABINA1 |  B | LISTO|  A |  OK  |
|  2 |CABINA2 |  A |  OK  |  B | LISTO|
En la TABLA_B la clave primaria es NOMBRE

Solo se me ocurre usar algo así para actualizar o inserta en esta tabla. Pero no se como integrar todo de una sola vez
Código SQL [-]
IF EXISTS(SELECT * FROM TABLA_B WHERE NOMBRE = NOMBRE)
    UPDATE 
    SET ...
    WHERE NOMBRE = NOMBRE
ELSE
    INSERT INTO
    ....

El motor es SQL Server.
Responder Con Cita
  #2  
Antiguo 27-11-2021
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Lo que describes y lo que pides no cuadra. Como va a ser "1 |CABINA1" el ultimo registro?
__________________
El malabarista.
Responder Con Cita
  #3  
Antiguo 27-11-2021
Avatar de MAXIUM
MAXIUM MAXIUM is offline
Miembro
 
Registrado: may 2005
Posts: 1.488
Poder: 20
MAXIUM Va camino a la fama
Cita:
Empezado por mamcx Ver Mensaje
Lo que describes y lo que pides no cuadra. Como va a ser "1 |CABINA1" el ultimo registro?
Bueno, el ID de la TABLA_B es independiente del ID de la TABLA_A por eso es 1

También debes fijaros en esta sentencia
Código SQL [-]
SELECT * FROM TABLA_A
WHERE ID IN (SELECT MAX(ID) FROM TABLA_A GROUP BY NOMBRE, TIPO);

Arroja esto
Código:
| ID | NOMBRE |TIPO|ESTADO|
|----|--------|----|------|
|  3 |CABINA1 |  B | LISTO|
|  4 |CABINA1 |  A |  OK  |
|  7 |CABINA2 |  A |  OK  |
|  8 |CABINA2 |  B | LISTO|
Por ende CABINA1 | B | LISTO es el último de los registros del tipo B de los CABINA1, lo mismo para el CABINA1 | A y resto de las cabinas

Considera una carga de datos de ejemplo como esta
Código:
| ID | NOMBRE |TIPO|ESTADO|
|----|--------|----|------|
|  1 |CABINA1 |  A |ACTIVO|
|  2 |CABINA1 |  B |ACTIVO|
|  3 |CABINA1 |  B | LISTO|
|  4 |CABINA1 |  A |  OK  |
|  5 |CABINA2 |  A | LISTO|
|  6 |CABINA2 |  B |ACTIVO|
|  7 |CABINA2 |  A |  OK  |
|  8 |CABINA2 |  B | LISTO|
Responder Con Cita
  #4  
Antiguo 29-11-2021
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
hola a todos!!

Sin dar muchos mas detalles de la relación existente entre los datos nombre/tipo y suponiendo que el campo tipo solo pude tener dos valores distintos (A, B), una solución para obtener los datos que marcas en el ejemplo puede ser esta:

Código SQL [-]
SELECT d1.nombre,
       t1.id,
       t1.tipo,
       t1.estado,
       t2.id,
       t2.tipo,
       t2.estado
  FROM (                                                                    --
        -- agrupa por nombre los distintos id de estado
        SELECT NOMBRE, MIN(UID) AS m1, MAX(UID) AS m2
          FROM (                                                            --
                -- seleciona el ultimo id de cada grupo de nombre, estado
                SELECT NOMBRE, MAX(ID) AS UID
                  FROM TABLA_A
                GROUP BY NOMBRE, TIPO) d0
        GROUP BY nombre) d1
       LEFT JOIN tabla_a t1 ON t1.id = m1
       LEFT JOIN tabla_a t2 ON t2.id = m2

Si el campo TIPO puede variar entre mas de dos valores distintos, entonces esta solución ya no es correcta.


Este hilo esta en el foro de MS-SQL. Si realmente estas utilizando MSSQL como motor de BBDD puede utilizar también la opción PIVOT, que permite agrupar múltiples registros en varias columnas de un único registro
Responder Con Cita
  #5  
Antiguo 29-11-2021
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.271
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Unas preguntas...
¿Los tipos sólo pueden ser A y B?
En cuanto al resultado en la TABLE_B
Código:
| ID |NOMBRE  |TIPO|ESTADO|TIPO|ESTADO|
|----|--------|----|------|----|------|
|  1 |CABINA1 |  B | LISTO|  A |  OK  |
|  2 |CABINA2 |  A |  OK  |  B | LISTO|

No acabo de entender que las 2 columnas TIPO tengan los valores cambiados. Es decir, no sería más fácil rellenar inicialmente la TABLA_B con unos valores tal que así:
Código:
| ID |NOMBRE  |TIPO|ESTADO|TIPO|ESTADO|
|----|--------|----|------|----|------|
|  1 |CABINA1 |  A | NULL |  B | NULL |
|  2 |CABINA2 |  A | NULL |  B | NULL |

Y luego ir haciendo UPDATES, según CABINA y TIPO.

Tampoco se si los valores CABINA1 y CABINA2 son de ejemplo y puedes tener más... (CABINA3, CABINA4,...)

Al final, para estos casos con una lógica más completa, también puedes hacer una función o un SP, que vaya haciendo los pasos que describes.
La SELECT INICIAL, luego la agrupación, y luego el INSERT o UPDATE final con un CASE.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 29-11-2021 a las 10:45:07.
Responder Con Cita
  #6  
Antiguo 29-11-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
De primer momento no contesté porque no se entiende correctamente el problema ni lo que se quiere conseguir.
Responder Con Cita
  #7  
Antiguo 29-11-2021
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por MAXIUM Ver Mensaje
Bueno, el ID de la TABLA_B es independiente del ID de la TABLA_A por eso es 1
Esto en parte refleja el problema. Los datos no se pueden diferenciar y por ende es dificil deducir como van al final.

Te recomiendo que le agreges un sufijo a los datos que marcan las diferencias (ej: id_a, cabina1_b) donde sea el caso.

---

Por otro lado, lo mas probable es que estas tratando de meter un circulo en un cuadrado. Cual es la RAZON y el objetivo de lo que haces?
__________________
El malabarista.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
insertar registro de otra tabla diferentes base de datos igamerpc Tablas planas 7 16-04-2020 11:11:29
Insertar datos de una Tabla a otra usando where... verito_83mdq SQL 5 15-03-2011 19:28:59
Dbgrid para insertar en una tabla pero cogiendo datos de otra tabla taru MySQL 1 27-07-2006 15:36:12
insertar datos en una tabla desde otra Giniromero SQL 5 17-06-2004 19:37:16
Como insertar datos de una tabla en otra tabla? Salomon Firebird e Interbase 1 28-08-2003 11:29:40


La franja horaria es GMT +2. Ahora son las 21:32:24.


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
Copyright 1996-2007 Club Delphi