Digamos que tengo estas dos tablas con las mismas columnas. Use su imaginación para hacerlos más grandes:¿Cómo fusiono dos tablas sin nombrar todas las columnas?
USER_COUNTERPARTY:
ID |Name |Credit Rating |Sovereign Risk |Invoicing Type
----+----------------------------+-----------------+------------------+---------------
1 |Nat Bank of Transnistria |7 |93 |Automatic
2 |Acme Ltd. |25 |12 |Automatic
3 |CowBInd LLP. |49 |12 |Manual
TEMP:
ID |Name |Credit Rating |Sovereign Risk |Invoicing Type
----+----------------------------+-----------------+------------------+---------------
2 |Acacacme Ltd. |31 |12 |Manual
4 |Disenthralled Nimrod Corp. |31 |52 |Automatic
y quiero fusionarlas en una sola, la sustitución con el segundo todo lo que tiene el mismo ID en la primera, y la inserción de todo lo que no está allí. Puedo usar esta afirmación:
MERGE INTO USER_COUNTERPARTY C
USING TEMP T
ON (C.COUNTER_ID = T.COUNTER_ID)
WHEN MATCHED THEN UPDATE SET
C.COUNTER_NAME = T.COUNTER_NAME,
C.COUNTER_CREDIT = T.COUNTER_CREDIT,
C.COUNTER_SVRN_RISK = T.COUNTER_SVRN_RISK,
C.COUNTER_INVOICE_TYPE = T.COUNTER_INVOICE_TYPE
WHEN NOT MATCHED THEN INSERT VALUES (
T.COUNTER_ID,
T.COUNTER_NAME,
T.COUNTER_CREDIT,
T.COUNTER_SVRN_RISK,
T.COUNTER_INVOICE_TYPE);
Que es lo suficientemente agradable, pero tenga en cuenta que debo nombrar cada una de las columnas. ¿Hay alguna manera de combinar estas tablas sin tener que nombrar todas las columnas? Oracle documentation insiste en que utilizo los nombres de las columnas después de 'insertar' y 'establecer' en una fusión, por lo que podría ser necesaria alguna otra declaración. El resultado debe ser el siguiente:
ID |Name |Credit Rating |Sovereign Risk |Invoicing Type
----+----------------------------+-----------------+------------------+---------------
1 |Nat Bank of Transnistria |7 |93 |Automatic
2 |Acacacme Ltd. |31 |12 |Manual
3 |CowBInd LLP. |49 |12 |Manual
4 |Disenthralled Nimrod Corp. |31 |52 |Automatic
En caso de que ayuda estoy pegando esto aquí:
CREATE TABLE USER_COUNTERPARTY
(COUNTER_ID INTEGER NOT NULL PRIMARY KEY,
COUNTER_NAME VARCHAR(38),
COUNTER_CREDIT INTEGER,
COUNTER_SVRN_RISK INTEGER,
COUNTER_INVOICE_TYPE VARCHAR(10));
INSERT ALL
INTO USER_COUNTERPARTY VALUES (1, ‘Nat Bank of Transnistria’, 7, 93, ‘Automatic’)
INTO USER_COUNTERPARTY VALUES (2, ‘Acme Ltd.’, 25, 12, ‘Manual’)
INTO USER_COUNTERPARTY VALUES (3, ‘CowBInd LLP.’, 49, 12, ‘Manual’)
SELECT * FROM DUAL;
CREATE TABLE TEMP AS SELECT * FROM USER_COUNTERPARTY;
DELETE FROM TEMP;
INSERT ALL
INTO TEMP VALUES (2, ‘Conoco Ltd.’, 25, 12, ‘Automatic’)
INTO TEMP VALUES (4, ‘Disenthralled Nimrod Corp.’, 63, 12, ‘Manual’)
SELECT * FROM DUAL;
Puede consultar el diccionario de datos (por ejemplo, 'USER_TAB_COLUMNS') para generar la lista de nombres de columna. –
Es verdad, puedes. ¿Pero entonces qué? Tal vez tenga que ponerlos en una colección, recorrerlos y usar una inserción dinámica. Para actualizar todas las columnas, creo que eliminar e insertar sería mejor. Pero tendré en cuenta el diccionario de datos. – jalopezp
"¿Pero entonces qué?" Como dije: * generar la lista de nombres de columna *. p.ej. 'SELECT ',' || column_name FROM user_tab_columns WHERE table_name = 'MYTABLE' ORDER BY column_id;' - luego copie y pegue los resultados en su declaración de fusión. Claro, no es bonito, y debe volver a hacerse si el esquema cambia, pero funciona. Ciertamente, no estoy hablando de generación de código en tiempo de ejecución :) –