【问题标题】:How to distinguish the same field names of two Oracle tables?如何区分两个Oracle表的相同字段名?
【发布时间】:2021-07-13 09:46:41
【问题描述】:

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

前:

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

enter image description here

我想区分这些列来自哪个表。

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

如何修改我的程序?

还有其他更简单的方法吗?

因为字段名太多

【问题讨论】:

  • 只是评论,您的表格有,而不是字段。
  • 使用一个工具,通常它会帮助您创建一个包含完整列列表的选择。

标签: sql oracle select field field-names


【解决方案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?
  • 如果您在查询中引用了多个表(例如,您连接两个表),请始终为所有表指定一个别名,并在您引用表的任何列时使用该别名。

【讨论】:

  • 有更简单的方法吗?因为字段太多
  • 不,没有简单的方法
【解决方案2】:

您可以构建一个查询并让它为您编写查询。好像没那么难

我创建了具有相同列名的表 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 以及您需要的其他部分

【讨论】:

    【解决方案3】:

    如果唯一共同的列名使用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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-03
      • 2013-03-15
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      相关资源
      最近更新 更多