关于sql:如何在不命名所有列的情况下合并两个表?

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语句中忽略这些默认值,但是,否则,您必须指定要插入或更新其值的每个列。

对于SELECT,没有像*这样的速记。