【问题标题】:oracle sql column aliasoracle sql 列别名
【发布时间】:2018-04-23 21:32:54
【问题描述】:

我有 3 个表 A、B、c,我想加入这些表。这些表有共同的列,如 id_no、order_no

我想编写一个查询,返回所有 3 个表中的所有列,列扩展名为 tabA.、tabB.、tabC....我不想手动指定所有列名。这样我就可以区分表中的公共列。

select tabA.id_no, tabA.order_no, tabA....., tabB.id_no, tabB.order_no,tabB..., tabC.id_no, tabC.order_no,tabC..
from A tabA, B tabB, C tabC
where tabA.id_no = tabB.id_no
and tabB.id_no = tabC.id_no

请告诉我如何在 oracle sql 中实现这一点。

【问题讨论】:

  • 请张贴CREATE TABLE 声明。从您的描述中不清楚外键是如何建立的。
  • 如果你说你希望所有列都以它们的表别名作为前缀,那么没有办法做到这一点。
  • 那么,您想在结果集中包含 id_no_tabA、id_no_tabB 等列名吗?抱歉,没有简单的方法可以避免手动单独输入这些名称。如果你的栏目太多,如果你创造性地懒惰(像我一样),你会写一些代码来为你编写代码;这是“元编程”,但没有工具可以直接进行。

标签: sql oracle alias


【解决方案1】:

Oracle SQL Developer 可以做到这一点。

编写您的 * 查询,将鼠标放在“*”上

SQL Developer 提议将其分解为完全限定的列列表,单击蓝色文本。

塔达。

不要忘记您在 FROM 中的 WHERE 子句或 ANSI 连接,否则您的 DBA 会向您解释什么是笛卡尔积。

如果您的表有外键,SQLDev 也可以生成它。

【讨论】:

    【解决方案2】:

    您可以执行以下操作:

    SELECT tabA.*, tabB.*, tabC.*
      FROM a tabA INNER JOIN b tabB
        ON tabA.id_no = tabB.id_no
     INNER JOIN c tabC
        ON tabB.id_no = tabC.id_no;
    

    编辑

    如果您只想获取与三个表关联的列的列表,并查看这三个表中哪些列名是通用的,那么您可以尝试以下操作:

    SELECT column_name, COUNT(*), LISTAGG(table_name, ',') WITHIN GROUP ( ORDER BY table_name
      FROM all_tab_columns
     WHERE owner = '<table_owner>'
       AND table_name IN ('A','B','C')
     GROUP BY column_name;
    

    注意LISTAGG() 假设您使用的是 Oracle 11g 或更高版本;在此之前,您可以使用未记录的函数WM_CONCAT()

    希望这会有所帮助。

    【讨论】:

    • 这使您无法控制结果集中的列名,这似乎是 OP 问题的唯一要点。
    • 也许我误解了他或她在问什么
    猜你喜欢
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    相关资源
    最近更新 更多