如何区分两个Oracle表的相同字段名?

时间:2021-04-19 07:45:19

标签: sql oracle select field field-names

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

例如:

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

enter image description here

我想区分 Columes 来自哪个表。

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

如何修改我的程序?

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

因为字段名太多

3 个答案:

答案 0 :(得分: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 *,始终明确列出所需的列。 Why is SELECT * considered harmful?
  • 如果查询中引用了多个表(例如,您连接两个表),请始终为所有表指定一个别名,并在引用表的任何列时使用该别名。

答案 1 :(得分: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 以及您需要的其他部分

答案 2 :(得分: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);

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