Powiedzmy, że mam te dwie tabele z tymi samymi kolumnami. Użyj wyobraźni, aby je powiększyć:Jak scalić dwie tabele bez nazywania wszystkich kolumn?
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
i chcę, aby połączyć je w jeden, zastępując jednego z drugim, co ma ten sam identyfikator w pierwszym i wstawienie cokolwiek nie ma. Mogę użyć tego stwierdzenia:
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);
Co jest wystarczająco dobre, ale zauważ, że muszę nazwać każdą z kolumn. Czy istnieje sposób na połączenie tych tabel bez konieczności wymieniania wszystkich kolumn? Oracle documentation twierdzi, że używam nazw kolumn po "wstawieniu" i "zestawie" w połączeniu, więc może być potrzebne inne zdanie. Wynik powinien być tak:
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
W przypadku pomaga mi wklejając ten tutaj:
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;
Można kwerendy słownika danych (np 'USER_TAB_COLUMNS'), aby wygenerować listę nazw kolumn. –
Prawda, możesz. Ale co wtedy? Być może będę musiał umieścić je w kolekcji, przejrzeć je i użyć dynamicznej wstawki. Aby zaktualizować wszystkie kolumny, myślę, że usuwanie i wstawianie byłoby lepsze. Ale będę pamiętał o słowniku danych. – jalopezp
"Ale co wtedy?" Jak już powiedziałem: * wygeneruj listę nazw kolumn *. na przykład 'SELECT ',' || column_name FROM user_tab_columns WHERE nazwa_tabeli = 'MYTABLE' ORDER BY id_kolumny;' - następnie kopiujesz i wklejasz wyniki do swojej instrukcji scalania. Jasne, to nie jest ładne i musi zostać powtórzone, jeśli schemat się zmieni, ale działa. Na pewno nie mówię o generowaniu kodu w czasie wykonywania :) –