【问题标题】:Oracle database: how to select all but return certain columns first?Oracle数据库:如何选择所有但首先返回某些列?
【发布时间】:2012-03-15 19:44:49
【问题描述】:

背景

我有一个 oracle 数据库表,其中有很多列,我正在运行一些查询。

我不知道我在查询中要查找的确切数据,所以我想返回所有列,但我不想寻找和挑选我知道有意义的列。

问题

假设一个表(表 1)包含 A 列、B 列、C 列....Z 列 --

有没有办法基本上说“选择 C ​​列、J 列、F 列、Q 列,然后从表 1 中选择其余列”?

我尝试过的事情

保持伪sql,运行:

从 Table1 中选择 C ​​列、J 列、F 列、Table1.*

没有帮助,因为即使我不介意重复,oracle 仍将它们视为定义不明确的列,因此返回错误。

【问题讨论】:

  • 另请注意——我已经在stackoverflow.com/questions/596841/… 尝试了相关答案,但到目前为止我看不到任何东西。
  • 为什么不直接按所需顺序明确枚举列 (SELECT C, J, F, A, B, D, ..., Z)?
  • 不,它不是那样工作的......你必须按照你想要的顺序选择所有列或执行 SELECT *
  • 你能提供一个实际的例子吗?我在您的查询中没有看到任何对数据库造成困难的内容。如果您在没有别名列的情况下将表连接在一起,那么我可能会看到一些关于不明确的列定义的信息……您是否遇到错误?请张贴!
  • @Venk 不,你可以两者都做。选择一些列然后使用*

标签: sql oracle oracle11g


【解决方案1】:

除了指定每一列之外,没有其他简单的方法可以做到这一点。

但如果你不介意重复并且你不关心列名,你可以给这些列起别名:

Select 
  ColumnC as ColumnC1, 
  ColumnJ as ColumnJ1, 
  ColumnF as ColumnF1,
  t.* 
from 
  Table1 as t

为了演示,我也给 Table1 起了别名。您可以省略 as 关键字,但我觉得它使它更具可读性。

请注意,虽然这些额外的列对 Oracle 来说并不难查询,但它们确实会产生额外的流量。对于测试,这个解决方案很好,但在生产代码中,我会选择只选择您需要的列,并且只选择一次。这只是一点额外的工作。毕竟,你有多少列? :)

【讨论】:

  • 如果你不给你的表起别名,你就不能使用这个技术。
  • 是的,你可以。为什么你认为你不能?
  • 我刚刚在 10G 数据库上测试过。它是允许的地方的参数吗?你是11G的吗?我得到ORA-00936: missing expression,它在星之前指向select project_id, * from pa_projects_all ;
  • 我认为你的意思是你不能单独使用*。但是,您可以将表名本身放在它之前 (select Table1 X as X2, Table1.* from Table1),因此您不需要表别名。如果您要使用星号,您需要以一种或另一种方式指定表格是对的,但这并不是真正的问题。 OP 已经在问题的代码示例中使用了它。
  • 哦!表名就像一个超级别名 :-) 是的,我的意思是你不能单独使用 *
【解决方案2】:

但是,您可以通过为您专门选择的列设置别名来解决此问题。例如

SELECT columnC new_columnC, columnJ new_columnJ, columnF new_columnF, t.*
  FROM table1 t

确保没有相同名称的列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多