How do I merge two tables without naming all columns?
所以说我有这两个表具有相同的列。用你的想象力使它们变大:
1 2 3 4 5 6 7 8 9 10 11 12 | 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 |
,我想将它们合并为一个,用第二个替换第一个具有相同ID的任何东西,然后插入不存在的任何东西。我可以使用以下语句:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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); |
哪一个足够好,但是请注意,我必须为每个列命名。有什么方法可以合并这些表而不必命名所有列? Oracle文档坚持要求我在合并中的"插入"和"设置"之后都使用列名,因此可能需要其他一些语句。结果应为:
1 2 3 4 5 6 | 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 |
如果有帮助,我可以在这里粘贴:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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; |
我相信您唯一需要避免使用列名的选择是两个单独的语句:
1 2 3 4 5 6 7 8 9 10 11 12 13 | DELETE FROM USER_COUNTERPARTY UC WHERE EXISTS (SELECT NULL FROM TEMP T WHERE T.COUNTER_ID = UC.COUNTER_ID); INSERT INTO USER_COUNTERPARTY UC SELECT * FROM TEMP T WHERE NOT EXISTS (SELECT NULL FROM USER_COUNTERPARTY UC WHERE T.COUNTER_ID = UC.COUNTER_ID); |
我遇到了描述的问题,并且我解决该问题的方法技术水平很低,但是我想我会分享一下,以防它引发人们其他想法。
我获取了列名(我从SQL Developer中的表DDL中提取了它们,但也使用了tab_columns表中的方法)并将其插入到Excel电子表格中。然后,我删除了Varchar etc语句(使用文本插入Excel函数列,然后仅删除varchar,number等语句结尾的列),因此只留下了字段名称。然后,我在下一个Excel列" dest"中插入了一个公式。
您可以尝试使用package的联合声明,如下所示:
1 2 3 4 5 | SELECT (*) FROM (SELECT * FROM Table1 WHERE ID NOT IN (SELECT ID FROM Table2) UNION ALL SELECT * FROM Table2) ORDER BY 1 |
n
如果您具有列的默认值(并且希望使用这些默认值),则可以从insert语句中忽略这些默认值,但是,否则,您必须指定要插入或更新其值的每个列。
对于