在表中重复列名有什么用吗?

2024-03-31

在 sqlite3 中,我可以强制两列使用相同的名称,如以下查询所示:

SELECT field_one AS overloaded_name,
       field_two AS overloaded_name
FROM my_table;

它返回以下内容:

overloaded_name  overloaded_name
---------------  ---------------
1                2
3                4
...              ...

... 等等。

但是,如果我使用相同的语法创建一个命名表,它会在其中一个别名后面附加一个:1:

sqlite> CREATE TABLE temp AS
          SELECT field_one AS overloaded_name,
                 field_two AS overloaded_name
          FROM my_table;
sqlite> .schema temp
CREATE TABLE temp(
  overloaded_name TEXT,
  "overloaded_name:1" TEXT
);

我运行原始查询只是为了看看这是否可行,令我惊讶的是它被允许了。这样做有什么充分的理由吗?假设不存在,为什么允许这样做?

EDIT:

我应该澄清:问题是双重的:为什么允许表创建成功,以及(更重要的是)为什么首先允许原始选择?

另外,请参阅我上面关于表创建的说明。


我可以强制两列使用相同的名称... 为什么[this]首先被允许?

这可以归因于兼容性的束缚 http://www.dcs.warwick.ac.uk/~hugh/TTM/Importance-of-Column-Names.pdf。在 SQL 标准中,没有任何内容被弃用。标准的早期版本允许表表达式的结果包含具有重复名称的列,可能是因为有影响力的供应商允许这样做,可能是由于包含错误或省略设计功能,并且没有做好准备冒破坏客户代码的风险(再次兼容性的束缚)。

在表中重复列名有什么用吗?

。仅仅因为 SQL 允许重复的列名,并不意味着作为 SQL 编码人员您应该利用此类功能;事实上,我想说你必须保持警惕,不要错误地调用此功能。我想不出在表中存在重复列名的任何充分理由,但我可以想到许多明显的不好的理由。这样的桌子不会成为一种关系,这也不是什么好事!

为什么[基]表创建可以成功

毫无疑问,这是对 SQL 标准的“扩展”(也称为故意违反),我认为它可以被视为一个合理的功能:如果我尝试创建具有重复名称的列,系统会自动通过添加序数后缀来消除它们的歧义。事实上,SQL 标准指定有一种依赖于实现的方法来确保表表达式的结果不会隐含地有重复的列名(但正如您在问题中指出的那样,这并不妨碍用户明确地使用重复的AS条款)。然而,我个人认为不允许重复名称并引发错误的标准行为是正确的。除了上述原因(即同一个表中的重复列没有什么用处)之外,在不知道系统是否遵循该名称的情况下创建对象的 SQL 脚本很容易出错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在表中重复列名有什么用吗? 的相关文章

  • 连接两个表的查询的 SQL Server“FOR XML”输出

    我是 SQL Server 中 FOR XML 功能的新手 我正在使用 SQL Server 2012 我有两个表 Word 和 Word Expansion 样本数据 表 字 WordOID Word 1 PIPE 2 WIRE 表 Wo
  • SQLite HAVING 比较错误

    我有一个测试 SQLite 表 用于存储带有值的报告数据 CREATE TABLE IF NOT EXISTS test fact daily revenue date TEXT revenue NUMERIC product TEXT I
  • 查找 PostgreSQL 中所有范围集合的所有交集

    我正在寻找一种有效的方法来查找时间戳范围集之间的所有交集 它需要与 PostgreSQL 9 2 配合使用 假设这些范围代表一个人可以见面的时间 每个人都可以有一个或多个空闲时间范围 我想找到all可以召开会议的时间段 即所有人都有空的时间
  • 如何将可视选择的文本通过管道传输到 UNIX 命令并将输出附加到 Vim 中的当前缓冲区

    使用 Vim 我尝试将在可视模式下选择的文本通过管道传输到 UNIX 命令 并将输出附加到当前文件的末尾 例如 假设我们有一个 SQL 命令 例如 SELECT FROM mytable 我想做如下的事情
  • 更改迁移中的自动​​增量值(PostgreSQL 和 SQLite3)

    我有一个托管在 Heroku 上的项目 想要更改表的自动增量起始值 我在本地使用 SQLite3 Heroku 使用 PostgreSQL 这是我在迁移中所拥有的 class CreateMytable lt ActiveRecord Mi
  • Mysql 检索所有有限制的行

    我想检索特定用户的所有行 限制为 0 x 所以我只是想问是否有任何方法可以检索 mysql 中的所有行 而不调用返回 x 的 count id 的方法 而不重载现有函数 该函数在查询中根本没有限制 与我们的 string Relace 功能
  • 分层查询

    我希望我能够解释困扰我的问题 我有以下分层数据集 这只是 34K 记录的子集 PARENT ID CHILD ID EXAM TUDA12802 TUDA12982 N TUDA12982 TUDA12984 J TUDA12984 TUD
  • 插入触发器最终在分区表中插入重复行

    我有一个分区表 我认为 适当的INSERT触发器和一些限制 不知何故 INSERT语句为每个语句插入 2 行INSERT 一个用于父分区 一个用于相应的分区 设置简要如下 CREATE TABLE foo id SERIAL NOT NUL
  • 列中差异的数量

    我想检索一列每行中有多少个字母的差异 例如 如果您有一个值 test 而另一行有一个值 testing 则 test 和 testing 之间的差异为 4 个字母 该列的数据值为 4 I have reflected about it an
  • 在 SQL 数据库中存储“列表”的最正确方法是什么?

    因此 我读了很多关于如何将多个值存储到一个列中是一个坏主意 并且违反了数据标准化的第一条规则 令人惊讶的是 这不是 不要谈论数据标准化 所以我需要一些帮助 目前我正在为我工 作的地方设计一个 ASP NET 网页 我想根据此人所属的 Act
  • SQLite .NET 性能,如何加快速度?

    在我的系统上 约 86000 个 SQLite 插入需要长达 20 分钟 意味着每秒约 70 个插入 我要做数百万 我怎样才能加快速度 对每一行的 SQLiteConnection 对象调用 Open 和 Close 会降低性能吗 交易有帮
  • 使用 ADODB 连接从关闭的工作簿中检索数据。某些数据被跳过?

    我目前正在编写一些代码 可以通过 ADODB 连接访问单独的工作簿 由于速度的原因 我选择了这种方法而不是其他方法 下面是我的代码 Sub GetWorksheetData strSourceFile As String strSQL As
  • MySQL 查询到 CSV [重复]

    这个问题在这里已经有答案了 有没有一种简单的方法来运行MySQL查询来自linux命令行并以csv格式输出结果 这就是我现在正在做的事情 mysql u uid ppwd D dbname lt lt EOQ sed e s g tee l
  • SELECT 语句会受到 SQL 注入攻击吗?

    实际上有2个问题 我知道我必须尽可能多地使用存储过程 但我想知道以下内容 A 我可以从 SELECT 语句 例如 Select from MyTable 获得 SQL 注入攻击吗 B 另外 当我在 ASP NET 中使用 SQLDataSo
  • android中向sqlite中插入大量数据

    目前 我必须一次向我的 Android 中插入超过 100 亿条数据 然而 内存不足的问题会使程序崩溃 sqlite 插入测试非常简单 只需使用 for 循环生成 sql 插入命令并通过 开始 和 提交 进行包装 private Array
  • 自加入表

    我有一张像这样的桌子 Employee name salary a 10000 b 20000 c 5000 d 40000 我想获取所有工资高于A工资的员工 我不想使用任何嵌套或子查询 在采访中被问及并暗示是使用自连接 我真的不知道如何实
  • 在 C#.NET 应用程序中使用 SQL Server 时间数据类型?

    如何使用 SQLtimeSQL Server 2008 中 C NET 中引入的数据类型 我一直在努力让它发挥作用 但没有成功 这是一个MSDN 文章 http msdn microsoft com en us library bb6751
  • 将表数据从一个 SQL Server 导出到另一台 SQL Server

    我有两个 SQL Server 都是 2005 版本 我想将多个表从一个表迁移到另一个表 我努力了 在源服务器上 我右键单击数据库 选择Tasks Generate scripts 问题是在下面Table View options没有Scr
  • 如何使用 LAMBDA 表达式在 LINQ 中执行 IN 或 CONTAINS?

    我有以下 Transact Sql 我正在尝试将其转换为 LINQ 并且很挣扎 SELECT FROM Project WHERE Project ProjectId IN SELECT ProjectId FROM ProjectMemb
  • MS ACCESS 计数/求和行数,不重复

    我有下表 我需要计算总行数而不包括任何重复记录 CustomerID test1 test1 test2 test3 test4 test4 如您所见 总行数为 6 但有两个 test1 和两个 test4 我希望查询返回 4 IOW 我想

随机推荐