我有两张不同的桌子。一个表有 70 个列,另一个有 80 个。我想显示两个表的所有列。但是有一些列具有相同的列名。
前任:
SELECT *
FROM TABLE1 A INNER JOIN
TABLE2 B ON A.ID = B.ID
我想区分Columes来自哪个表。
我知道必须明确列出您的列列表并在 SELECT 列表中为它们提供别名。
如何修改我的程序?
有没有其他更简单的方法。
因为字段名太多
您必须明确列出您的列列表并在 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 * 被认为是有害的?
如果唯一共同的列名使用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);
为了使这更简单,您可以使用元数据表。
您可以构建一个查询并让它为您编写查询。这并不像看起来那么难
我创建了具有相同列名和托管数据库的表 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 以及您需要的其他部分