0

我有两张不同的桌子。一个表有 70 个列,另一个有 80 个。我想显示两个表的所有列。但是有一些列具有相同的列名。

前任:

SELECT * 
FROM TABLE1 A INNER JOIN
     TABLE2 B ON A.ID = B.ID

在此处输入图像描述

我想区分Columes来自哪个表。

我知道必须明确列出您的列列表并在 SELECT 列表中为它们提供别名。

如何修改我的程序?

有没有其他更简单的方法。

因为字段名太多

4

3 回答 3

1

您必须明确列出您的列列表并在 SELECT 列表中为它们提供别名。

SELECT
    A.ID AS A_ID,
    B.ID AS B_ID
FROM TABLE1 A INNER JOIN
     TABLE2 B ON A.ID = B.ID

作为最佳实践

  • 切勿SELECT *在生产查询中使用,始终明确列出所需的列。为什么 SELECT * 被认为是有害的?
  • 当您在查询中引用了多个表(例如,您连接两个表)时,请始终为所有表指定一个别名,并在您引用表的任何列时使用该别名。
于 2021-04-19T07:48:10.203 回答
0

如果唯一共同的列名使用JOIN键,那么您可以将其表述为:

SELECT * 
FROM TABLE1 A INNER JOIN
     TABLE2 B 
     USING (ID);

ID列仅在结果集中出现一次。

如果其他列很常见,那么您需要使用列别名。有时,使用这样的东西很方便:

SELECT A.*, B.col1 as b_col1, B.col2 as b_col2, . . .
FROM TABLE1 A INNER JOIN
     TABLE2 B 
     USING (ID);

为了使这更简单,您可以使用元数据表。

于 2021-04-19T11:53:24.223 回答
0

您可以构建一个查询并让它为您编写查询。这并不像看起来那么难

我创建了具有相同列名和托管数据库的表 TEST1 和 TEST2 来列出所有带前缀的列。

select 'select ' txt from dual
union all
select listagg('t1.' || atc.COLUMN_NAME, ', ') within group (order by atc.COLUMN_NAME) || ', '
  from all_tab_cols atc
 where table_name = 'TEST1'
union all
select listagg('t2.' || atc.COLUMN_NAME, ', ') within group (order by atc.COLUMN_NAME)
  from all_tab_cols atc
 where table_name = 'TEST2';

输出是

TXT
----------
select
t1.NUM_COL, t1.TEXT_COL,
t2.NUM_COL, t2.TEXT_COL

因此,您可以运行查询,复制输出,然后添加 FROM 和 WHERE 以及您需要的其他部分

于 2021-04-19T08:45:58.453 回答