列顺序很重要的 Oracle DB 简单 SELECT

Posted

技术标签:

【中文标题】列顺序很重要的 Oracle DB 简单 SELECT【英文标题】:Oracle DB simple SELECT where column order matters 【发布时间】:2009-02-27 21:55:51 【问题描述】:

我正在 Oracle DB 中执行一个简单的 SELECT 语句,并且需要以某种特定的顺序选择列。示例:

表 A 有 100 个属性,其中之一是按表中列顺序出现在某处的“章节​​”。我需要先选择带有“章节”的数据,然后选择剩余的列,没有特定的顺序。从本质上讲,我的声明需要这样写:

SELECT a.chapter, a. *the remaining columns* FROM A

此外,我不能简单地输入:

SELECT a.chapter, a.*

因为这会选择“章节”两次。

我知道 SQL 语句看起来很简单,但如果我知道如何解决这个问题,我可以将这个想法外推到更复杂的领域。另外,假设我不能只是滚动找到“章节”列并将其拖到开头。

谢谢。

【问题讨论】:

您可以说“a.chapter, a.*”,因为 SQL 不在乎您是否选择了它两次。这可能有点浪费,但非常简单。 你最近能找到一些新的解决方案吗?我使用 DBVisualizer,默认情况下它按创建日期的顺序表示表列。 GUI 只允许拖放列以手动设置出现顺序。但是小事一桩,我重启DBVisualizer后,它重置了默认顺序…… 【参考方案1】:

您不应在程序中选择 *。随着模式的发展,它会带来你还不知道的东西。想想当有人添加一个包含整本书的专栏时会发生什么?您认为非常便宜的查询突然开始带来数兆字节的数据。

这意味着您必须指定您需要的每一列。

【讨论】:

【参考方案2】:

您最好的选择是明确选择每一列。

【讨论】:

【参考方案3】:

解决此问题的快速方法是 SELECT a.chapter AS chapterCol, a.* FROM table a;这意味着将有一个列名称 chapterCol(假设那里还没有一个名为 chapterCol 的列。;))

【讨论】:

【参考方案4】:

如果您要将“SELECT *”嵌入到程序代码中,那么我强烈建议您不要这样做。正如前面的作者所指出的,如果曾经将列添加到表中(或从表中删除),则设置代码以中断。简单的建议是不要这样做。

如果您在开发工具中使用它(查看数据等)。然后,我建议使用您需要的特定列顺序创建一个视图。从 'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS' 捕获输出,并使用您需要的列顺序为视图创建一个选择语句。

【讨论】:

【参考方案5】:

这就是我构建查询的方式,无需输入所有名称,但需要手动操作。

从“选择一个章节”开始

现在在您的数据库上执行另一个选择,如下所示:

选择','||列名 来自 user_tab_cols 其中 table_name = your_real_table_name 和 column_name 'CHAPTER';

现在以剪切和粘贴的方式从中获取输出并将其附加到您开始的内容中。现在运行该查询。应该是你要求的。

哒哒!

【讨论】:

【参考方案6】:

除非您有充分的理由这样做,否则您不应在查询中使用 SELECT *。每次架构更改时,它都会破坏您的应用程序。

【讨论】:

是的,但是表中有 100 列是想要使用“*”的原因。我们可以辩论桌子的设计质量,当然…… 我理解这个论点,我不得不做出同样的决定。生成列列表并将其插入到查询中需要几分钟,我认为这是值得的时间。

以上是关于列顺序很重要的 Oracle DB 简单 SELECT的主要内容,如果未能解决你的问题,请参考以下文章

LogisticRegression scikit学习协变量(列)顺序对训练很重要

DB2如何把列 修改为 "可空"?

SQL Server 中多列非聚集索引中的列顺序是不是重要?

ORACLE 限制某些IP用户的对重要表的恶意操作

关于Oracle数据库格式列的一个简单问题

Oracle 等待事件:您如何解释 db 文件分散/顺序读取?